Freigeben über


Crypt32-Zertifikatsperrliste (CRL)-Semantik

Crypt32 unterstützt die CRL-Semantik (Certificate Revocation List) für die Onlinesperrüberprüfung. Dieser Artikel enthält Informationen dazu, wie Crypt32 CRLs für die Onlinesperrüberprüfung verwendet und wie CRL vor dem Abrufen und Partitionieren verwendet werden kann, um die Leistung zu verbessern.

Einführung

Wenn die Crypt32 CertGetCertificateChain-API mit aktivierter Onlinesperrung aufgerufen wird, wird versucht, eine zeit gültige OCSP-Antwort oder CRL wie folgt abzurufen:

  • Überprüfen Sie, ob eine zeit gültige, geheftete OCSP-Antwort im Handshake enthalten war.
  • Überprüfen Sie, ob eine gültige OCSP-Antwort oder CRL im Cryptnet-URL-Cache des Benutzers vorhanden ist.
  • Überprüfen Sie, ob eine gültige CRL in einem Systemspeicher vorhanden ist, z. B. HKLM\CA.
  • Versuchen Sie bei der OCSP-URL in der AIA-Erweiterung des Antragstellerzertifikats, die OCSP-Antwort vom OCSP-Server herunterzuladen.
    • Fügen Sie bei Erfolg die OCSP-Antwort zum Cryptnet-URL-Cache des Benutzers hinzu.
  • Versuchen Sie für die CRL-CDP-Erweiterung im Antragstellerzertifikat, die CRL vom CRL-Server der Zertifizierungsstelle (CRL) der Zertifizierungsstelle herunterzuladen.
    • Zum Erfolg fügen Sie die CRL zum Cryptnet-URL-Cache des Benutzers hinzu.

Für eine CRL, die dem Cryptnet-URL-Cache hinzugefügt wird, wird die nächste CRL abgerufen, bevor sie abläuft, wenn die CRL die folgende Erweiterung hat: "1.3.6.1.4.1.311.21.4" (Nächste CRL-Veröffentlichung). Durch Hinzufügen dieser Erweiterung findet nur der anfängliche CRL-Download während der Zertifikatüberprüfung statt. Weitere Informationen dazu, wie Crypt32 diese Erweiterung verwendet, um die nächste CRL vorab abzurufen, finden Sie im Abschnitt "CRL Pre-Fetching ".

Wenn eine Zertifizierungsstelle eine hohe Anzahl von Zertifikaten ausgibt, kann die Anzahl der widerrufenen Einträge in einer CRL ebenfalls groß werden, wodurch die Größe der CRL erhöht wird. Um die Größe der CRL in Prüfung zu behalten, empfiehlt und unterstützt Microsoft die CRL-Partitionierung über die Erweiterung "2.5.29.28" (Ausstellender Verteilungspunkt), die der heruntergeladenen CRL hinzugefügt wurde. Weitere Informationen dazu, wie Crypt32 die CRL-Partitionierung über diese Erweiterung unterstützt, finden Sie im Abschnitt zur CRL-Partitionierung .

Die Zertifizierungsstelle erwägt, die Unterstützung für OCSP zu löschen und nur unterstützende CRLs zu berücksichtigen, um die Auswirkungen zu berücksichtigen, die dies auf Anwendungen hat, die die CertGetCertificateChain-API mit aktivierter Onlinesperrung aufrufen:

  • Bei der ersten Überprüfung führt die aufrufende Anwendung einen CRL-Download bei Bedarf durch und blockiert das Abschließen der API, bis die CRL heruntergeladen wird.
    • Für TLS-Server mit hohem Volumen gibt es entsprechende Downloads mit hohem Volumen vom CRL-Server der Zertifizierungsstelle.
    • Wenn die CRL groß wird, wirkt sich dies direkt auf den Server aus, der eine hohe Anzahl von Downloads verarbeiten kann.
      • Die Größe der CRL kann durch unterstützung partitionierte CRLs eingeschränkt werden.
  • Nachfolgende Überprüfungen verwenden die zwischengespeicherte CRL, bis die CRL abläuft. Wenn die CRL abläuft, wird die oben genannte Datei für die nächste Überprüfung wiederholt.
    • Dieser CRL-Download bei Bedarf kann vermieden werden, indem die Erweiterung "NächsteS CRL Publish" hinzugefügt wird.

In den folgenden Abschnitten finden Sie Informationen zum Vorababrufen und Partitionieren von CRL zur Verbesserung der Onlinesperrleistung, in denen nur CRLs verwendet werden.

Vorababrufen von CRL

Eine codierte CRL weist die folgenden beiden Felder auf, die angeben, wann die CRL veröffentlicht wurde und wie lange der Client zwischenspeichern kann, bevor die nächste veröffentlichte CRL abgerufen werden muss.

ThisUpdate    GeneralizedTime,
NextUpdate    GeneralizedTime OPTIONAL,

Wenn NextUpdate fehlt, ist dies die letzte CRL, die veröffentlicht werden soll und nie abläuft.

Eine CRL kann die Erweiterung "1.3.6.1.4.1.311.21.4" (Next CRL Publish) enthalten, die auch als GeneralizedTime codiert ist. Wenn diese Erweiterung vorhanden ist, versucht Crypt32, die nächste veröffentlichte CRL nach dieser PublishTime und vor NextUpdate wie folgt vorab abzurufen:

Gegeben, PublishPeriod = NextUpdate – PublishTime. Die folgenden drei Konfigurationsparameter werden verwendet, um den Start und das Ende des PreFetchPeriod zu bestimmen:

  • AfterPublishPreFetchDivisor
    • Der Start des PreFetchPeriod wird nach der PublishTime verzögert, indem das PublishPeriod durch diesen Divisor geteilt wird.
    • Standardwert von 10
  • BeforeNextUpdatePreFetchDivisor
    • The finish of the PreFetchPeriod occurs before NextUpdate by divisor by this divisor.
    • Standardwert von 20
  • MinPreFetchPeriod
    • Gegeben, PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime. Das Vorabrufen ist nur aktiviert, wenn das PreFetchPeriod dieses Minimum überschreitet.
    • Standardeinstellung von 1 Stunde

Angesichts des oben berechneten PreFetchPeriod-Ereignisses wird innerhalb dieses PreFetchPeriods für jeden Client eine zufällige Zeit ausgewählt, um die veröffentlichte CRL vom Server vorab abzurufen und herunterzuladen.

Einige Beispielzeiten und das entsprechende PreFetchPeriod mit den Standardkonfigurationswerten.

CRL ist für zwei Tage gültig und täglich veröffentlicht:

ThisUpdate:  Nov 05 08:00 
NextUpdate:  Nov 07 08:00 
PublishTime: Nov 06 08:00 

PublishPeriod = 24 hours 
PreFetchPeriodStartTime  = PublishTime + 24/10 (2.4 hours) 
PreFetchPeriodFinishTime = NextUpdate – 24/20 (1.2 hours) 

PreFetchPeriod = Nov 06 10:24 .. Nov 07 06:48 = 20:24  

Clients would randomly pre-fetch in the above PreFetchPeriod. 

CRL ist für acht Tage gültig und wird alle vier Tage veröffentlicht:

ThisUpdate:  Nov 03 08:00 
NextUpdate:  Nov 11 08:00 
PublishTime: Nov 07 08:00 

PublishPeriod = 96 hours 
PreFetchPeriodStartTime  = PublishTime + 96/10 (9.6 hours) 
PreFetchPeriodFinishTime = NextUpdate – 96/20 (4.8 hours) 

PreFetchPeriod = Nov 07 17:36 .. Nov 11 03:12 = 81:36 

Clients would randomly pre-fetch in the above PreFetchPeriod 

Hinweis

Wenn die vorab abgerufene CRL nicht vom Client verwendet wird, wird die oben genannte Vorababrufung beendet, bis der Client einen neuen On Demand-Download für diese CRL initiiert.

CRL-Partitionierung

Dieser Abschnitt enthält Informationen dazu, wie Crypt32 die CRL-Partitionierung unterstützt.

Beispiel

Nachfolgend sehen Sie ein Beispiel für eine häufig formatierte CDP- und IdP-Erweiterung (IDP), die für die CRL-Partitionierung verwendet wird.

Für die erste Partition von Zertifikaten, die von der Zertifizierungsstelle ausgestellt wurden:

Cert CDP:
[1]CRL Distribution Point
     Distribution Point Name:
          Full Name:
               URL=http://crl.godaddy.com/first.crl

CRL IDP:
Distribution Point Name:
     Full Name:
               URL=http://crl.godaddy.com/first.crl
Only Contains User Certs=No
Only Contains CA Certs=No
Indirect CRL=No

Für die zweite Partition von Zertifikaten, die von der Zertifizierungsstelle ausgestellt wurden, verweist auf eine andere CRL sowohl im CDP als auch im IDP:

Cert CDP:
[1]CRL Distribution Point
     Distribution Point Name:
          Full Name:
               URL=http://crl.godaddy.com/second.crl

CRL IDP:
Distribution Point Name:
     Full Name:
               URL=http://crl.godaddy.com/second.crl
Only Contains User Certs=No
Only Contains CA Certs=No
Indirect CRL=No

Wie Sie sehen können, wird die gleiche einzelne HTTP-CRL-URL sowohl im CDP als auch im IDP verwendet. Außerdem werden die partitionierten CRLs direkt von der Zertifizierungsstelle signiert und gelten sowohl für CAs als auch für Endbenutzerzertifikate.

Der nächste Abschnitt enthält Details zur ASN.1-Codierung der IDP- und CDP-Erweiterungen und was von Crypt32 unterstützt wird.

Details

Dies ist die ASN.1 für die Erweiterung "Ausstellender Verteilungspunkt (IDP)" ("2.5.29.28"):

--------------------------------------------
-- CRL Issuing Distribution Point Extension
--------------------------------------------
IssuingDistributionPoint ::= SEQUENCE {
    issuingDistributionPoint    [0] EXPLICIT DistributionPointName OPTIONAL,
    onlyContainsUserCerts       [1] IMPLICIT BOOLEAN DEFAULT FALSE,
    onlyContainsCACerts         [2] IMPLICIT BOOLEAN DEFAULT FALSE,
    onlySomeReasons             [3] IMPLICIT ReasonFlags OPTIONAL,
    indirectCRL                 [4] IMPLICIT BOOLEAN DEFAULT FALSE
} --#public—

DistributionPointName ::= CHOICE {
    fullName                [0] IMPLICIT GeneralNames,
    nameRelativeToCRLIssuer [1] IMPLICIT RelativeDistinguishedName
}

GeneralNames ::= SEQUENCE OF GeneralName

GeneralName ::= CHOICE {
    otherName               [0] IMPLICIT OtherName,
    rfc822Name              [1] IMPLICIT IA5STRING,
    dNSName                 [2] IMPLICIT IA5STRING,
    x400Address             [3] IMPLICIT SeqOfAny,
    directoryName           [4] EXPLICIT NOCOPYANY,    -- really Name
    ediPartyName            [5] IMPLICIT SeqOfAny,
    uniformResourceLocator  [6] IMPLICIT IA5STRING,
    iPAddress               [7] IMPLICIT OCTETSTRING,
    registeredID            [8] IMPLICIT EncodedObjectID
}

Wenn eine CRL über einen IDP verfügt, wird der Windows-Client wie folgt fortgesetzt:

  • IDPs ignorieren, die Folgendes haben:
    • onlySomeReasons
    • indirectCRL
  • Unterstützt nur IDPs mit der Option "fullName ".
    • Das CRL CDP muss auch die Option "fullName" haben.
  • Wenn nurContainsUserCerts oder nurContainsCACerts:
    • Verwenden Sie die grundlegende Einschränkungserweiterung des Zertifikats, um zu ermitteln, ob der IDP auf das Zertifikat anwendbar ist.

Dies ist die ASN.1 für die CDP-Erweiterung in einem Zertifikat:

--------------------------------------------
-- CRL Distribution Points Extension
--------------------------------------------
CRLDistributionPoints ::= SEQUENCE OF DistributionPoint

DistributionPoint ::= SEQUENCE {
    distributionPoint       [0] EXPLICIT DistributionPointName OPTIONAL,
    reasons                 [1] IMPLICIT ReasonFlags OPTIONAL,
    cRLIssuer               [2] IMPLICIT GeneralNames OPTIONAL
}

DistributionPointName see above

Ein Windows-Client führt Folgendes aus:

  • Durchlaufen Sie die Sequenz von GeneralNames durch den IDP, bis eine Übereinstimmung mit einem CDP-Namen vorliegt:
    • Durchlaufen der CDP-Sequenz von DistributionPoints:
      • CdP DistributionPoint überspringen mit:
        • Begründungen
        • cRLIssuer
      • Überspringen Sie CDP DistributionPoint, wenn sie keine fullName-Option für DistributionPointName hat.
      • Durchlaufen der CDP-Sequenz von GeneralNames:
        • Überprüfen, ob IDP und CDP GeneralName übereinstimmen
          • Wenn IsSameGeneralName(), haben wir eine Übereinstimmung, und die CRL kann für das Antragstellerzertifikat verwendet werden.

IsSameGeneralName(IDP_GeneralName, CDP_GeneralName)

Der IDP und CDP müssen die gleiche Option für "GeneralName " haben. Bei gleicher Auswahl vergleichen Sie den IDP- und CDP-Namen entsprechend der Auswahl:

  • rfc822Name
    • Vergleich der Zeichenfolgen ohne Groß-/Kleinschreibung. Keine % Zeichennormalisierung.
  • dNSName
    • Vergleich der Zeichenfolgen ohne Groß-/Kleinschreibung. Keine % Zeichennormalisierung.
  • uniformResourceLocator (URL)
    • Vergleich der Zeichenfolgen ohne Groß-/Kleinschreibung. Keine % Zeichennormalisierung.
  • otherName
    • Der OID- und OID-spezifische Binärwert werden verglichen.
  • registeredID
    • Die OIDs werden verglichen.
  • directoryName
    • Die codierten Namenbytes werden verglichen.
  • iPAddress
    • Die codierten OKTETTbytes werden verglichen.
  • x400Address
    • Nicht unterstützt.
  • ediPartyName
    • Nicht unterstützt.

Es wird erwartet, dass die Option "uniformResourceLocator GeneralName " verwendet wird.

CertGetCertificateChain

CertGetCRLContextProperty

Kryptografiefunktionen