服务器证书不正确的第一个请求的HttpWebRequest超时

本文关键字:HttpWebRequest 超时 请求 第一个 不正确 服务器 证书 | 更新日期: 2023-09-27 18:21:24

我使用以下代码接受错误的服务器证书:

ServicePointManager.ServerCertificateValidationCallback = delegate(object s,
  X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    Debug.WriteLine("Returned certificate valid");
    return true;
}

和这个代码提出请求:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://localhost/test");
req.Timeout = 5000;
try {
    Debug.WriteLine("Checking...");
    HttpWebResponse response = (HttpWebResponse)req.GetResponse();
    Debug.WriteLine("Done");
}
catch
{
    Debug.WriteLine("Error");
    //error
}

第一次运行这个请求时,它会等待5秒,然后抛出超时异常。验证回调在超时前成功执行,我可以看到正确的(无效的)证书被传入

如果我将超时时间增加到15秒,那么执行回调需要15秒,然后请求超时。

后续请求(无需重新启动程序)的成功率约为90%。(其中10%暂停;其他人几乎立即返回。)这里发生了什么?

编辑:如果我拔下网络连接,所有请求都会成功返回,这让我觉得它一定是在尝试联系CA或其他什么。。。为什么它会超时而不是抛出安全异常,我该如何停止?

第二版:我评论了ScottSmith的建议,现在所有请求都成功了!有时他们在旧的超时期之前成功了,这真的让我很困惑。有什么办法可以让.net停止在幕后验证证书吗?

第3版:我发现了一个论坛帖子,我认为它解释了我的问题。看看这个页面上的最后一篇文章:http://www.pcreview.co.uk/forums/ie-going-very-slow-if-certificate-isnt-valid-t735059.html我使用了wireshark,一旦发出请求,就会对www.download.windowupdate.com进行3次DNS查询。一旦它们失败(因为计算机没有连接到互联网),最终会调用证书验证回调,请求完成。如果有人能想出一种方法来禁用这种行为,那将是令人惊讶的。

服务器证书不正确的第一个请求的HttpWebRequest超时

很难判断出了什么问题,但需要检查一些事情:

  • 添加处理程序后,将ServicePointManager.CheckCertificateRevocationList显式设置为false(默认为false,但在您的情况下可能是true

  • 在回调中检查sslPolicyErrors的值,也许它会给你一些关于发生了什么的线索

  • 检查req.ServicePoint的属性,这可能有助于缩小正在发生的事情(特别是查看您的请求是否被重定向)

  • 检查您的代理设置,它们可能是问题的一部分

  • 有很多TCP/IP通信在进行吗?(使用netstat进行检查,查看是否有几个TIME_WAIT套接字)

  • 从浏览器尝试该URL时会发生什么?

  • 查看web服务器(IIS?)上的日志,了解有关http请求的任何信息

更新-从OP编辑后:

你可以尝试将ServicePointManager.DnsRefreshTimeout设置为一个非常高的值,看看这是否有帮助,但要注意这可能会产生其他负面影响!

OP的答案编辑3
我也遇到了同样的问题。答案是通过在Windows中编辑组策略设置来禁用"自动根证书更新"组件。关于如何在Windows Server 2008中运行的说明如下:http://technet.microsoft.com/en-us/library/cc734054%28v=ws.10%29.aspx

更新步骤摘要:

  1. 打开本地组策略编辑器(从命令行键入gpedit.msc)
  2. 导航到:管理模板->系统->Internet通信管理->Internet通信设置
  3. 双击"关闭自动根证书更新"
  4. 单击"启用",单击"确定"
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

是什么让这个HTTPS WebRequest即使在浏览器中工作也会超时?

这解决了我的问题

我编写的一个应用程序在使用双向SSL的WinPE 4.0环境中运行时遇到问题。

最初的连接花了一分钟的时间。听起来很像你在编辑中说的是你的问题。

由于环境的原因,没有组策略编辑器,所以我需要跟踪支持它的注册表值,以便在脱机wim中设置它。

HKLM'Software'Policies'Microsoft'SystemCertificates'AuthRoot

DisableRootAutoUpdate DWORD Value 1

来源:http://www.group-policy.com/ref/policy/452/Turn_off_Automatic_Root_Certificates_Update