我连接的服务器最近更改了它的 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))
如果我不请求 CRL 验证,那么它几乎立即返回,启用 CRL 检查,大约 4 秒。
我怀疑如果我手动尝试在我的 RemoteCertificateValidationCallback 中构建链,我会看到同样的延迟。
如果 CRL 被缓存,这不会真正成为问题,但是这种缓存似乎不适用于 Windows7 客户。为什么??好吧,我想这是下一个任务......
谁能解释一下是什么导致链构建需要这么长时间?
最佳答案
似乎这里是这个问题的答案:
https://blogs.msdn.microsoft.com/alejacma/2011/09/27/big-delay-when-calling-sslstream-authenticateasclient/
关于c# - SslStream.AuthenticateAsClient() 使用未缓存的 CRL 非常慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7907874/