C# SslStream.authenticatesClient()非常慢,带有未缓存的CRL

C# SslStream.authenticatesClient()非常慢,带有未缓存的CRL,c#,.net-3.5,ssl,C#,.net 3.5,Ssl,我连接的服务器最近更改了其SSL证书。自更改后,下载证书吊销列表时,SSL身份验证需要超过10秒的时间才能完成。 我使用RemoteCertificateChainCallback来验证证书,但是延迟发生在调用回调之前,因此导致延迟的不是证书链的构建或任何其他操作 该问题仅在CRL未缓存时发生,即我需要删除CRL缓存(Documents&settings/[user]AppData/Microsoft/CertificateUrlCache或类似内容),以便在一天内重复多次 如果我在authen

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

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

该问题仅在CRL未缓存时发生,即我需要删除CRL缓存(Documents&settings/[user]AppData/Microsoft/CertificateUrlCache或类似内容),以便在一天内重复多次

如果我在authenticatesClient()调用中禁用CRL检查,则身份验证会很快完成

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

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

有没有人对这一阶段可能发生的情况以及延误的原因有什么建议

谢谢

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

if (!CAPISafe.CertGetCertificateChain(hChainEngine, pCertContext, ref pTime, invalidHandle, ref cert_chain_para, dwFlags, IntPtr.Zero, ref ppChainContext))
如果我没有请求CRL验证,那么在启用CRL检查的情况下,几乎会在4秒钟内立即返回

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

如果CRL被缓存,这其实不是什么问题,但是对于Windows7客户来说,这种缓存似乎不起作用。为什么?我想这是下一个任务


有人能解释一下是什么原因导致连锁店建设耗时这么长吗?

似乎这个问题的答案如下:

进一步挖掘,以了解CertGetCertificateChain采取行动的原因 很长时间以来,我看到我们正试图从 互联网:

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