建立SSL \ TLS连接(X509Chain.Build())需要太长时间

时间:2012-05-23 16:17:59

标签: c# .net ssl system.net.httpwebrequest

我发现当我使用HttpWebRequest建立SSL \ TLS连接时,调用时需要近30秒

  request.GetRequestStream()

当我启用了启用堆栈跟踪的跟踪时,我发现2s会找到poxy,所以我在app.config中禁用了它:

<system.net>
 <defaultProxy enabled="false" useDefaultCredentials="false">
  <proxy/>
  <bypasslist/>
  <module/>
 </defaultProxy>
</system.net>

接近28s的下一个点是

   at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)

在检查方法体后,我发现了对X509Chain.Build()的调用,并且花了将近25秒来构建证书链。

有趣的是,当你构造新的HttpWebReqest并再次尝试(没有app重启)时,执行请求需要几个ms。

有人可以建议做什么吗?缓存请求不是一个选项,它应该从应用程序运行快速。

更新

我在X509Chain.BuildChain()中发现需要30秒的调用,它是:

if (!CAPISafe.CertGetCertificateChain(hChainEngine, pCertContext, ref pTime, invalidHandle, ref cert_chain_para, dwFlags, IntPtr.Zero, ref ppChainContext))

在CAPISafe中声明为:

的方法
[DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool CertGetCertificateChain([In] IntPtr hChainEngine, [In] SafeCertContextHandle pCertContext, [In] ref System.Runtime.InteropServices.ComTypes.FILETIME pTime, [In] SafeCertStoreHandle hAdditionalStore, [In] ref CAPIBase.CERT_CHAIN_PARA pChainPara, [In] uint dwFlags, [In] IntPtr pvReserved, [In, Out] ref SafeCertChainHandle ppChainContext);

因此,它是加密API函数CertGetCertificateChain 仍然不知道,下一步该做什么......

更新

我试图禁用CRL和OCSP检查,但仍无效:

  1. 添加到App.config

    <runtime>
      <generatePublisherEvidence enabled="false"/>
    </runtime>
    
  2. 机器范围:控制面板 - &gt;互联网选项 - &gt;高级 - &gt;在安全下, 取消选中“检查发布者的证书吊销选项”

  3. 在注册表中:

    [HKEY_USERS \ S-1-5-20 \ Software \ Microsoft \ Windows \ CurrentVersion \ WinTrust \ Trust Providers \ Software Publishing] “状态”= DWORD:00023e00

2 个答案:

答案 0 :(得分:5)

最后我找到了问题的根源。我在事件日志中启用了CAPI2日志记录,并在尝试从以下位置下载证书信任列表时发现了NetworkTimeoutException:

http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab

那就是防火​​墙问题。 您可以阅读有关调查过程和所用技术的blogpost

答案 1 :(得分:4)

通常情况下,路径构建意味着构建一个有效的路径,并且需要检查是否有任何证书自颁发以来一直是revoked

要检查当前的撤销状态,您需要来自CRL或OCSP响应者的最新信息。如果在设置路径验证请求期间未明确提供正确的CRL,则如果"CRL Distribution Points" extension.

中列出了CRL的URL,则许多库将尝试获取它(通常通过Internet)

如果网络速度慢,路径很长或CRL很大,这可能需要一些时间。也许这就是你需要这么长时间的事情。由于它在第一次运行后运行速度很快,我猜测在第一次尝试时会下载一些大型CRL并缓存以供后续使用。

或者,库可能会自动联系OCSP responder,如果它在"Authority Information Access" extension.中公布的话。但是,某些库需要显式配置才能使用OCSP,或者更喜欢它的CRL。

如果您要验证来自众多不同发卡机构的证书,请尝试在可用的地方使用OCSP。协议速度很快,响应很小,通常包含有关单个证书的信息,而不是发行人撤销的每个证书。

如果您要验证来自单个发行者的许多证书,请在后台热切地下载该发行者的CRL并将其保留到期满为止。然后将CRL传递给路径构建过程,以便在用户等待时不必下载它。

相关问题