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

Ive*_*Ive 5 c# ssl .net-3.5

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

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

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

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

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

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

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

谢谢!

更新:好的,我已经使用反射器和内存分析器进行了深入研究。身份验证为客户端。看起来大部分时间都花在构建证书链上,即:

if (!CAPISafe.CertGetCertificateChain(hChainEngine, pCertContext, ref pTime, invalidHandle, ref cert_chain_para, dwFlags, IntPtr.Zero, ref ppChainContext))
Run Code Online (Sandbox Code Playgroud)

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

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

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

谁能解释一下是什么导致链构建需要这么长时间?

Sar*_*rus 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

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