SslStream.Authenticateaclient() ОЧЕНЬ медленно с некэшированным CRL

#c# #.net-3.5 #ssl

#c# #.net-3.5 #ssl

Вопрос:

Сервер, к которому я подключаюсь, недавно изменил свой SSL-сертификат. С момента изменения проверка подлинности SSL занимает более десяти секунд, чтобы завершить загрузку списка отзыва сертификата.

Я использую RemoteCertificateChainCallback для проверки сертификата, однако задержка возникает ДО вызова обратного вызова, поэтому задержку вызывает не создание цепочки сертификатов или каких-либо других действий

Проблема возникает только тогда, когда CRL НЕ КЭШИРУЕТСЯ, т.Е. Мне нужно удалить кеш CRL (Documents amp; settings / [user]AppData / Microsoft / CertificateUrlCache или что-то подобное), чтобы повторить его более одного раза в день.

Если я отключу проверку CRL в вызове authenticateaclient(), аутентификация будет быстрой.

Используя сетевой анализатор, я вижу, что когда CRL в конечном итоге запрашивается, он загружается почти мгновенно, поэтому задержка не связана с задержкой в сети (по крайней мере, не для CRL-сервера).

Одна странная вещь, которую я вижу с помощью сетевого анализатора, заключается в том, что после первоначального извлечения SSL-сертификата с сервера возникает пятисекундная задержка до загрузки CRL.**

Есть ли у кого-нибудь какие-либо предложения относительно того, что может происходить на этом этапе, и чем может быть вызвана задержка?

Спасибо!

ОБНОВЛЕНИЕ: ХОРОШО, я использовал отражатель и профилировщик памяти, чтобы углубиться. Authenticateaclient. Похоже, что большая часть времени тратится на построение цепочки сертификатов, т.е.:

 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, когда мы создадим цепочку сертификатов, сертификат корневого центра сертификации которых не установлен в системе. Это называется функцией автоматического обновления корневых сертификатов, и она доступна в Windows XP / Server 2003 и более поздних версиях ОС, включая Windows 7 / Server 2008 R2.