服务器证书不正确的第一个请求的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查询。一旦它们失败(因为计算机没有连接到互联网),最终会调用证书验证回调,请求完成。如果有人能想出一种方法来禁用这种行为,那将是令人惊讶的。
很难判断出了什么问题,但需要检查一些事情:
-
添加处理程序后,将
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
更新步骤摘要:
- 打开本地组策略编辑器(从命令行键入gpedit.msc)
- 导航到:管理模板->系统->Internet通信管理->Internet通信设置
- 双击"关闭自动根证书更新"
- 单击"启用",单击"确定"
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