SslStream.AuthenticateAsClient()使用未缓存的CRL非常慢

时间:2011-10-26 19:35:30

标签: c# .net-3.5 ssl

我连接的服务器最近更改了它的SSL证书。自更改以来, SSL认证在下载证书吊销列表时需要超过十秒钟。

我正在使用 RemoteCertificateChainCallback 验证证书,但是在调用回调之前会发生延迟,因此不是构建证书链或导致延迟的任何其他操作< / p>

问题只发生在CRL未缓存时,即我需要删除CRL缓存(Documents&amp; settings / [user] AppData / Microsoft / CertificateUrlCache 或类似的)以重新启动它而不是一天一次。

如果我在AuthenticateAsClient()调用中禁用CRL检查,则身份验证很快。

使用网络嗅探器,我可以看到最终请求 CRL时,它几乎立即下载,因此延迟不是网络延迟(至少不是CRL服务器)。

我在网络嗅探器中看到的一件奇怪的事情是,在从服务器检索初始SSL证书之后,在下载CRL之前有五秒钟的延迟。**

有没有人对这个阶段可能发生的事情有什么建议,以及延迟可能是由什么引起的?

谢谢!

更新:好的,我已经使用了反射器和内存分析器来深入研究。 AuthenticateAsClient。它似乎大部分时间用于构建证书链,即:

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

如果我没有请求CRL验证,那么几乎立即返回,启用CRL检查,大约4秒。

我怀疑如果我手动尝试在RemoteCertificateValidationCallback中构建链,我会看到相同的延迟。

如果CRL被缓存,这不会是一个问题,但似乎这个缓存不适用于Windows7客户。 为什么 ??嗯,我想这是下一个任务......

任何人都可以解释可能导致连锁建设花费这么长时间的原因吗?

1 个答案:

答案 0 :(得分:0)

这似乎是这个问题的答案:

https://blogs.msdn.microsoft.com/alejacma/2011/09/27/big-delay-when-calling-sslstream-authenticateasclient/

  

进一步深入了解CertGetCertificateChain采取的原因   这么久,我看到我们试图从中下载以下文件   互联网:

     

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

     

我们为什么要下载此文件?嗯,这将默认发生   在Windows上,当我们构建根CA证书不是的证书链时   安装在系统中。这称为自动根   证书更新功能,可在Windows XP / Server上使用   2003及更高版本的操作系统版本,包括Windows 7 / Server 2008 R2。