Semantica dell'elenco di revoche di certificati Crypt32
Crypt32 supporta la semantica dell'elenco di revoche di certificati (CRL) per il controllo delle revoche online. Questo articolo fornisce informazioni su come Crypt32 usa CRL per il controllo delle revoche online e sul modo in cui è possibile usare il prelettura e il partizionamento CRL per migliorare le prestazioni.
Introduzione
Quando l'API Crypt32 CertGetCertificateChain viene chiamata con la revoca online abilitata, tenterà di recuperare una risposta OCSP valida per l'ora o CRL come indicato di seguito:
- Controllare se una risposta OCSP graffata valida è stata inclusa nell'handshake.
- Controllare se è disponibile una risposta OCSP valida o CRL nella cache dell'URL Cryptnet dell'utente.
- Controllare se è presente un CRL valido per l'ora in un archivio di sistema, ad esempio HKLM\CA.
- Per l'URL OCSP nell'estensione AIA del certificato soggetto, provare a scaricare la risposta OCSP dal server OCSP.
- Per un esito positivo, aggiungere la risposta OCSP alla cache dell'URL Cryptnet dell'utente.
- Per l'estensione CDP CRL nel certificato soggetto, provare a scaricare il CRL dal server CRL dell'autorità di certificazione (CA).
- Per un esito positivo, aggiungere il CRL alla cache dell'URL Cryptnet dell'utente.
Per un CRL aggiunto alla cache Cryptnet URL, il CRL successivo verrà recuperato prima della scadenza se il CRL ha l'estensione seguente: "1.3.6.1.4.1.311.21.4" (pubblicazione CRL successiva). Aggiungendo questa estensione, durante la convalida del certificato verrà eseguito solo il download CRL iniziale. Per altre informazioni su come Crypt32 usa questa estensione per prelettura, vedere la sezione Pre-recupero CRL per CRL successivo.
Se un'autorità di certificazione emette un volume elevato di certificati, il numero di voci revocate in un CRL potrebbe anche diventare elevato, aumentando le dimensioni del CRL. Per mantenere sotto controllo le dimensioni del CRL, Microsoft consiglia e supporta il partizionamento CRL tramite l'estensione "2.5.29.28" (Punto di distribuzione emittente) aggiunta al CRL scaricato. Per altre informazioni su come Crypt32 supporta il partizionamento CRL tramite questa estensione, vedere la sezione Partizionamento CRL.
La CA sta valutando l'eliminazione del supporto per OCSP e solo il supporto di CRL deve prendere in considerazione l'impatto sulle applicazioni che chiamano l'API CertGetCertificateChain con revoca online abilitata:
- Nella prima convalida, l'applicazione chiamante eseguirà un download CRL su richiesta e bloccherà il completamento dell'API fino a quando non viene scaricato il CRL.
- Per i server TLS con volumi elevati, verranno scaricati volumi elevati corrispondenti dal server CRL della CA.
- Se il CRL diventa grande, avrà un impatto diretto sul server in grado di gestire un volume elevato di download.
- Le dimensioni del CRL possono essere limitate supportando CRL partizionati.
- Le convalide successive useranno il CRL memorizzato nella cache fino alla scadenza del CRL. Alla scadenza del CRL, l'oggetto precedente verrà ripetuto per la convalida successiva.
- Questo download CRL su richiesta può essere evitato aggiungendo l'estensione Next CRL Publish.
Le sezioni seguenti forniscono informazioni sul prelettura e il partizionamento CRL per migliorare le prestazioni di revoca online in cui vengono usati solo CRL.
Prelettura CRL
Un CRL codificato include i due campi seguenti che indicano quando è stato pubblicato il CRL e per quanto tempo il client può memorizzare nella cache prima di dover recuperare il CRL pubblicato successivo.
ThisUpdate GeneralizedTime,
NextUpdate GeneralizedTime OPTIONAL,
Se NextUpdate manca, si tratta dell'ultimo CRL da pubblicare e non scadrà mai.
Un CRL può contenere l'estensione "1.3.6.1.4.1.311.21.4" (Next CRL Publish) codificata anche come GeneralizedTime. Quando questa estensione è presente, Crypt32 tenterà di recuperare il CRL pubblicato successivo dopo PublishTime e prima di NextUpdate come indicato di seguito:
Dato, PublishPeriod = NextUpdate – PublishTime
. Per determinare l'inizio e la fine di PreFetchPeriod vengono usati i tre parametri di configurazione seguenti:
- AfterPublishPreFetchDivisor
- L'inizio di PreFetchPeriod viene ritardato dopo l'operazione PublishTime dividendo PublishPeriod da questo divisore.
- Valore predefinito 10
- BeforeNextUpdatePreFetchDivisor
- La fine di PreFetchPeriod si verifica prima di NextUpdate dividendo PublishPeriod da questo divisore.
- Valore predefinito 20
- MinPreFetchPeriod
- Dato,
PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime
. La prelettura è abilitata solo se PreFetchPeriod supera questo valore minimo. - Impostazione predefinita di 1 ora
- Dato,
Data la prefetchPeriod precedente calcolata, viene selezionato un tempo casuale all'interno di questo preFetchPeriod per ogni client per eseguire il prelettura e scaricare il CRL pubblicato dal server.
Alcune volte di esempio e il Valore PreFetchPeriod corrispondente usando i valori di configurazione predefiniti.
CRL è valido per due giorni e pubblicato ogni giorno:
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 è valido per otto giorni e pubblicato ogni quattro giorni:
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
Nota
Se il CRL prelettura non viene usato dal client, il prelettura precedente verrà arrestato fino a quando il client non avvia un nuovo download su richiesta per questo CRL.
Partizionamento CRL
Questa sezione fornisce informazioni sul modo in cui Crypt32 supporta il partizionamento CRL.
Esempio
Di seguito è riportato un esempio di estensione CDP e IDP (Identity Provider) formattata comunemente usata per il partizionamento CRL.
Per la prima partizione di certificati rilasciati dalla CA:
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
Per la seconda partizione di certificati rilasciati dalla CA, punta a un CRL diverso sia in CDP che in 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
Come si può notare, lo stesso URL CRL http singolo viene usato sia in CDP che in IDP. Inoltre, i CRL partizionati sono firmati direttamente dalla CA e sono applicabili sia alle ca che ai certificati dell'utente finale.
La sezione successiva fornisce informazioni dettagliate sulla codifica ASN.1 delle estensioni IDP e CDP e sulle funzionalità supportate da Crypt32.
Dettagli
AsN.1 per l'estensione IDP (Issuing Distribution Point) ("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
}
Se un CRL ha un provider di identità, il client Windows procede come segue:
- Ignorare gli IDP con:
- onlySomeReasons
- indirectCRL
- Supporta solo gli IDP con la scelta fullName .
- Il cdp CRL deve avere anche la scelta fullName.
- Se soloContainsUserCerts o soloContainsCACerts:
- Usare l'estensione dei vincoli di base del certificato per determinare se l'IDP è applicabile al certificato.
Si tratta dell'ASN.1 per l'estensione CDP in un certificato:
--------------------------------------------
-- 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
Un client Windows:
- Scorrere la sequenza IDP di GeneralNames fino a quando non viene trovata una corrispondenza con un nome CDP:
- Scorrere la sequenza di punti di distribuzione di CDP:
- Ignorare CDP DistributionPoint con:
- Motivi
- cRLIssuer
- Ignorare CDP DistributionPoint se non ha una scelta fullName per DistributionPointName.
- Scorrere la sequenza cdp di GeneralNames:
- Controllare se IDP e CDP GeneralName corrispondono
- Se IsSameGeneralName(), è presente una corrispondenza e il CRL può essere usato per il certificato soggetto.
- Controllare se IDP e CDP GeneralName corrispondono
- Ignorare CDP DistributionPoint con:
- Scorrere la sequenza di punti di distribuzione di CDP:
IsSameGeneralName(IDP_GeneralName, CDP_GeneralName)
IDP e CDP devono avere la stessa scelta GeneralName . Per la stessa scelta, confrontare il nome IDP e CDP in base alla scelta:
- rfc822Name
- Confronto tra stringhe senza distinzione tra maiuscole e minuscole. Nessuna normalizzazione di caratteri %.
- dNSName
- Confronto tra stringhe senza distinzione tra maiuscole e minuscole. Nessuna normalizzazione di caratteri %.
- uniformResourceLocator (URL)
- Confronto tra stringhe senza distinzione tra maiuscole e minuscole. Nessuna normalizzazione di caratteri %.
- otherName
- Vengono confrontati i valori binari specifici dell'OID e dell'OID.
- registeredID
- Gli OID vengono confrontati.
- directoryName
- Vengono confrontati i byte dei nomi codificati.
- iPAddress
- Vengono confrontati i byte OCTET codificati.
- x400Address
- Non supportato.
- ediPartyName
- Non supportato.
L'aspettativa è che verrà usata la scelta uniformResourceLocator GeneralName .