C# HttpWebRequest在服务器证书错误的第一个请求上超时

C# HttpWebRequest在服务器证书错误的第一个请求上超时,c#,.net,ssl,x509certificate,C#,.net,Ssl,X509certificate,我正在使用以下代码接受错误的服务器证书: ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate cert, X509Chain chain, SslPolicyErrors sslPolicyErrors) { Debug.WriteLine("Returned certificate valid"); return true; } 并使用此代

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

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或其他什么。。。为什么它会超时而不是抛出一个安全异常?我如何才能阻止它

编辑2:我注释掉了超时@ScottSmith的建议,所有请求现在都成功了!有时他们在旧的超时时间之前成功了,这让我很困惑。有没有办法让.net停止在幕后验证证书


编辑3:我发现了一个论坛帖子,我认为这可以解释我的问题。请看本页的最后一篇文章:我使用了wireshark,一旦发出请求,就会对www.download.windowsupdate.com进行3次DNS查询。一旦它们失败(因为计算机未连接到internet),将最终调用证书验证回调,请求完成。如果有人能想出一种方法来禁用这种行为,那将是令人惊讶的。

很难判断出问题出在哪里,但有一些事情需要检查:

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

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

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

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

  • 是否有大量TCP/IP通信正在进行?(请与netstat联系,查看是否有多个TIME\u WAIT套接字)

  • 从浏览器中尝试该URL时会发生什么情况

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

更新-从OP编辑后:


您可以尝试设置一个非常高的值,看看这是否有帮助,但请注意,这可能会有其他负面影响

很难判断出什么地方出了问题,但有一些东西需要检查:

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

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

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

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

  • 是否有大量TCP/IP通信正在进行?(请与netstat联系,查看是否有多个TIME\u WAIT套接字)

  • 从浏览器中尝试该URL时会发生什么情况

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

更新-从OP编辑后:

您可以尝试设置一个非常高的值,看看这是否有帮助,但请注意,这可能会有其他负面影响

OP编辑3的答案:
我也遇到了同样的问题。答案是通过在Windows中编辑组策略设置禁用自动根证书更新组件。有关如何在Windows Server 2008中运行的说明如下:

更新步骤摘要:

  • 打开本地组策略编辑器(从命令行键入gpedit.msc)
  • 导航到:管理模板->系统->互联网通信管理->互联网通信设置
  • 双击“关闭自动根证书更新”
  • 单击“启用”,单击“确定”
  • OP编辑3的答案:
    我也遇到了同样的问题。答案是通过在Windows中编辑组策略设置禁用自动根证书更新组件。有关如何在Windows Server 2008中运行的说明如下:

    更新步骤摘要:

  • 打开本地组策略编辑器(从命令行键入gpedit.msc)
  • 导航到:管理模板->系统->互联网通信管理->互联网通信设置
  • 双击“关闭自动根证书更新”
  • 单击“启用”,单击“确定”
  • 这解决了我的问题


    这解决了我的问题

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

    最初的连接需要一分钟的时间。听起来很像你刚才说的是你编辑的问题

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

    HKLM\Software\Policys\Microsoft\SystemCertificates\AuthRoot

    DisableRootAutoUpdate DWORD值1


    来源:

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

    最初的连接需要一分钟的时间。听起来像
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;