【发布时间】:2012-02-21 21:44:57
【问题描述】:
我需要信任应用程序中的一些自签名证书,所以我像这样覆盖验证回调:
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
...
public static bool MyRemoteCertificateValidationCallback(
Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
if (IsAprrovedByMyApplication(sender, certificate)) // <-- no matter what the check here is
return true;
else
return false; // <-- here I'd like to call the default Windows handler rather than returning 'false'
}
但是当有一些策略错误,并且我连接的站点没有被应用程序批准时,就会抛出异常。 这里的问题是它不同于标准的 Windows 行为。
考虑这个网站:https://www.dscoduc.com/
它的证书有一个未知的颁发者,因此不受信任。我已将它与 MMC 一起添加到本地计算机的受信任的人(它是 Windows 7)。
如果我在不覆盖证书验证回调的情况下运行此代码:
HttpWebRequest http = (HttpWebRequest)HttpWebRequest.Create("https://www.dscoduc.com/");
using (WebResponse resp = http.GetResponse())
{
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
string htmlpage = sr.ReadToEnd();
}
}
连接成功。 这意味着 Windows 默认验证器决定信任此证书。
但是一旦我覆盖了 ServerCertificateValidationCallback,我的回调就会被调用 SslPolicyErrors.RemoteCertificateChainErrors 并且链包含一个状态为 X509ChainStatusFlags.PartialChain 的元素(实际上我希望这里不会收到任何错误,因为当前的证书应该是可信的)
此站点未包含在我的信任列表中,并且不想从我的回调中返回“true”。 但我也不想返回'false',否则我会得到一个异常:“根据验证程序,远程证书无效”,这显然不是https://www.dscoduc.com/所期望的,因为它已添加到受信任的人存储,并在证书回调未被覆盖时由 Windows 批准。 因此,我希望 Windows 采用该站点的默认验证程序。我不想亲自查看 Windows 受信任的商店并遍历所有链元素,因为它已经(并且希望正确)在 Windows 中实现。
换句话说,我需要明确信任用户批准的网站(存储在他的设置中的某处),并为所有其他网站调用默认认证检查。
ServicePointManager.ServerCertificateValidationCallback 的默认值为 null,因此没有“默认”回调供我稍后调用。 我应该如何调用这个“默认”证书处理程序?
【问题讨论】:
标签: .net ssl certificate x509certificate