2013-06-09 2 views
5

Мой вопрос похож на вопрос this.Режим автономного отзыва

Я пытаюсь проверить список отзыва только с помощью местного CRL.

Я использую X509Chain.Build() со следующими параметрами:

var chainMachine = new X509Chain(true); 
      chainMachine.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain; 
      chainMachine.ChainPolicy.UrlRetrievalTimeout = TimeSpan.FromSeconds(30); 
      chainMachine.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 
      chainMachine.ChainPolicy.VerificationTime = DateTime.Now; 
      chainMachine.ChainPolicy.RevocationMode = X509RevocationMode.Offline; 

Но я получаю следующие ошибки:

  1. RevocationStatusUnknown => Функция отзыва не может проверить отзыв для сертификата.
  2. OfflineRevocation => Функция отзыва не смогла проверить отзыв для сертификата, поскольку сервер аннулирования в автономном режиме.

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

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

может кто-нибудь указать, в чем причина Эта проблема?

+0

Я также видел такое же поведение ,Он не говорит мне, что сервер отключен, он просто говорит, что не может проверить отзыв. Это не похоже на самозаверяющие сертификаты. – Mark

ответ

1

X509RevocationMode.None: Не проверяйте CRL или OCSP.

X509RevocationMode.Offline: Если CRL в кэше и остается в силе, использовать его для отмены. В противном случае, если проверка сертификата должна была быть отменена (в зависимости от EntireChain/ExcludeRoot/EndCertificateOnly), сообщите об автономном режимеVerification | RevocationStatusUnknown. (Ответы OCSP также могут быть кэшированы, если их значение nextUpdate предлагает, но я не уверен, что он делает это или нет).

X509RevocationMode.Online: Если конечная точка OCSP описана в сертификате, выполните проверку OCSP. Если OCSP не дает окончательного ответа и определена точка распространения CRL, проверьте кеш для CRL. Если это действительно, используйте его в качестве основы для отзыва; в противном случае загрузить CRL и кешировать его. Если все попытки найти статус аннулирования, установите RevocationStatusUnknown.

Offline режим сложный, из-за истечения срока действия CRL. Даже если вы только что сделали онлайн-запрос час назад, это не значит, что Offline будет работать сейчас. Лучшее использование, о котором я могу думать, это сделать счастливый путь быстрым; и если вы получите какие-либо ошибки, кроме RevocationStatusUnknown или OfflineRevocation, тогда подумайте, что цепочка не удалась ... но одно из этих способов снова запрашивает режим Online.

(Как можно определить с помощью http://referencesource.microsoft.com, Offline соответствует CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY, что примерно так же скудно документированы https://msdn.microsoft.com/en-us/library/windows/desktop/aa376078(v=vs.85).aspx, но, возможно, «Проверка кэша только» часть более поучительно)