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

Posted

技术标签:

【中文标题】SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢【英文标题】:SslStream.AuthenticateAsClient() VERY slow with uncached CRL 【发布时间】:2011-12-16 00:16:05 【问题描述】:

我连接的服务器最近更改了它的 SSL 证书。自更改以来,下载证书吊销列表时,完成 SSL 身份验证需要十多秒。

我正在使用 RemoteCertificateChainCallback 来验证证书,但是延迟发生在回调被调用之前,所以它不是证书链的构建或导致延迟的任何其他操作

仅当 CRL 未缓存时才会出现此问题,即我需要删除 CRL 缓存(Documents&settings/[user]AppData/Microsoft/CertificateUrlCache 或类似的东西)以多次复制它一天。

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

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

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

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

谢谢!

更新:好的,我已经使用反射器和内存分析器进行了深入研究。 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】:

看来这个问题的答案如下:

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。

【讨论】:

以上是关于SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢的主要内容,如果未能解决你的问题,请参考以下文章