2013-06-09 7 views
5

Meine Frage ist ähnlich wie this Frage.Offline-Sperrmodus

Ich versuche, die Sperrliste nur mithilfe der lokalen CRL zu überprüfen.

I X509Chain.Build() mit den folgenden Parametern bin mit:

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; 

Aber ich erhalte die folgenden Fehler:

  1. RevocationStatusUnknown => Der Widerruf Funktion nicht in der Lage ist, den Widerruf zu überprüfen für das Zertifikat.
  2. OfflineRevocation => Die Sperrfunktion konnte die Sperrung für das Zertifikat nicht überprüfen, da der Sperrserver offline ist.

Das Seltsame ist, dass wenn ich versuche Online die Sperrliste zu überprüfen (als Ergebnis wird die CRL aktualisiert werden), das Problem ist aufgelöst. Es sieht also so aus, dass sobald das Problem behoben ist, das Problem nicht mehr reproduziert werden kann.

Ich dachte, dass die Fehlermeldung möglicherweise falsch ist und was tatsächlich passiert ist, dass, wenn der Cache leer ist, gibt es eine Ausnahme, die diese Nachricht auftaucht. eine andere Option ist, dass es einige Flag gibt, die sagen, ob der Cache irgendwann aktualisiert wurde, und wenn es nie aktualisiert wurde versucht es die Informationen von einem externen Server

kann jemand darauf hinweisen, was der Grund dafür ist dieses Problem?

+0

Ich sehe auch das gleiche Verhalten .Es sagt mir nicht, dass der Server offline ist, es sagt nur, dass es den Widerruf nicht überprüfen konnte. Bei selbstsignierten Zertifikaten scheint dies nicht der Fall zu sein. – Mark

Antwort

1

X509RevocationMode.None: Überprüfen Sie keine CRLs oder OCSP.

X509RevocationMode.Offline: Wenn eine CRL zwischengespeichert ist und immer noch gültig ist, verwenden Sie sie für den Widerruf. Andernfalls, wenn das Zertifikat eine Sperrung hätte (abhängig von EntireChain/ExcludeRoot/EndCertificateOnly), melden Sie OfflineVerification | RevocationStatusUnknown. (OCSP-Antworten können auch zwischengespeichert werden, wenn ihr Wert nextUpdate darauf hinweist; aber ich bin mir nicht sicher, ob dies der Fall ist oder nicht).

X509RevocationMode.Online: Wenn ein OCSP-Endpunkt im Zertifikat beschrieben ist, führen Sie eine OCSP-Prüfung durch. Wenn OCSP keine schlüssige Antwort liefert und ein CRL-Verteilungspunkt definiert ist, überprüfen Sie den Cache für die CRL. Wenn es gültig ist, verwenden Sie es als Grundlage für den Widerruf; Andernfalls laden Sie die CRL herunter und cachen Sie sie. Wenn alle Versuche zum Auffinden eines Sperrstatus fehlschlagen, legen Sie RevocationStatusUnknown fest.

Der Offline-Modus ist aufgrund des CRL-Ablaufs schwierig. Selbst wenn Sie gerade vor einer Stunde eine Online-Anfrage gemacht haben, heißt das nicht, dass Offline jetzt funktioniert. Der beste Gebrauch, den ich mir vorstellen kann, ist, den glücklichen Weg schnell zu machen; Wenn Sie andere Fehler als "RevocationStatusUnknown" oder "OfflineRevocation" erhalten, sollten Sie die Kette als fehlgeschlagen betrachten. Sie müssen jedoch im Online-Modus erneut nachfragen.

(Wie über http://referencesource.microsoft.com bestimmt werden, Offline-entspricht CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY, die etwa so dünn an https://msdn.microsoft.com/en-us/library/windows/desktop/aa376078(v=vs.85).aspx dokumentiert ist, aber vielleicht der „Check Cache Only“ Teil ist erhellender)