2011-10-26 38 views
4

我连接的服务器最近更改了它的SSL证书。自更改以来,下载证书吊销列表时,SSL认证需要超过10秒才能完成。SslStream.AuthenticateAsClient()非缓存未缓存CRL

我使用RemoteCertificateChainCallback验证证书,但发生时间延迟之前调用回调,所以它不是证书链或任何其他行动建设存在是造成延迟

这个问题只发生在CRL没有被缓存时,也就是我需要删除CRL缓存(Documents & 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客户来说不起作用。 为什么 ??那么我想这是下一个任务...

任何人都可以解释什么可能导致连锁建设需要这么久?

回答

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

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