8

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

  request.GetRequestStream()

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

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

下一个需要 28 秒左右的时间点在

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

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

有趣的是,当您构造新的 HttpWebReqest 并再次尝试(无需重新启动应用程序)时,执行请求需要几个毫秒。

谁能建议该怎么做?缓存请求不是一个选项,它应该从应用程序运行开始很快。

更新

我在 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);

所以,是 Crypto API 函数CertGetCertificateChain 还是不知道,接下来要做什么......

更新:

我试图禁用 CRL 和 OCSP 检查,仍然没有效果:

  1. 添加到 App.config

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

  3. 在注册表中:

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

4

2 回答 2

8

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

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

所以,那是防火墙问题。您可以阅读有关调查过程和使用的技术的博文。

于 2012-06-13T21:56:19.847 回答
4

通常,路径构建意味着构建一个有效的路径,这需要检查是否有任何证书自颁发以来已被吊销

为了检查当前的撤销状态,您需要来自 CRL 或 OCSP 响应者的最新信息。如果在路径验证请求的设置过程中没有明确提供正确的 CRL,如果 CRL 的 URL 列在“CRL 分发点”扩展中,许多库将尝试获取它(通常通过 Internet) 。

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

或者,如果在“Authority Information Access”扩展中宣传,图书馆可能会自动联系OCSP 响应者。但是,某些库需要显式配置才能使用 OCSP,或者更喜欢它而不是 CRL。

如果您要验证来自许多不同颁发者中的每个颁发者的一些证书,请尝试在任何可用的地方使用 OCSP。该协议速度很快,响应很小,通常包含有关单个证书的信息,而不是颁发者曾经吊销的每个证书。

如果您要验证来自单个颁发者的多个证书,请在后台急切地下载该颁发者的 CRL 并保留它直到它过期。然后将 CRL 传递到路径构建过程中,这样就不必在用户等待时下载它。

于 2012-05-23T16:49:19.713 回答