Sémantique de la liste de révocation de certificats Crypt32
Crypt32 prend en charge la sémantique de liste de révocation de certificats (CRL) pour la vérification de la révocation en ligne. Cet article fournit des informations sur la façon dont Crypt32 utilise des LISTES de révocation en ligne pour la vérification de révocation en ligne et sur la façon dont la pré-extraction et le partitionnement de la liste de révocation de certificats peuvent être utilisées pour améliorer les performances.
Introduction
Lorsque l’API CertGetCertificateChain Crypt32 est appelée avec la révocation en ligne activée, elle tente de récupérer une réponse OCSP valide ou une liste de révocation de certificats comme suit :
- Vérifiez si une réponse OCSP valide valide a été incluse dans la négociation.
- Vérifiez si nous avons une réponse OCSP ou une liste de révocation de certificats valides dans le cache d’URL Cryptnet de l’utilisateur.
- Vérifiez si nous avons une liste de révocation de certificats valide dans un magasin système, tel que HKLM\CA.
- Pour l’URL OCSP dans l’extension AIA du certificat d’objet, essayez de télécharger la réponse OCSP à partir du serveur OCSP.
- Pour réussir, ajoutez la réponse OCSP au cache d’URL Cryptnet de l’utilisateur.
- Pour l’extension CDP de liste de révocation de certificats dans le certificat sujet, essayez de télécharger la liste de révocation de certificats à partir du serveur de liste de révocation de certificats (CA) de l’autorité de certification.
- Pour réussir, ajoutez la liste de révocation de certificats au cache d’URL Cryptnet de l’utilisateur.
Pour une liste de révocation de certificats ajoutée au cache d’URL Cryptnet, la liste de révocation de certificats suivante est récupérée avant son expiration si la liste de révocation de certificats a l’extension suivante : « 1.3.6.1.4.1.311.21.4 » (publication suivante de la liste de révocation de certificats). En ajoutant cette extension, seul le téléchargement initial de la liste de révocation de certificats aura lieu pendant la validation du certificat. Pour plus d’informations sur la façon dont Crypt32 utilise cette extension pour pré-extraire la liste de révocation de certificats suivante, consultez la section Pré-extraction de la liste de révocation de certificats.
Si une autorité de certification émet un volume élevé de certificats, le nombre d’entrées révoquées sur une liste de révocation de certificats peut également devenir volumineux, augmentant ainsi la taille de la liste de révocation de certificats. Pour conserver la taille de la liste de révocation de certificats à vérifier, Microsoft recommande et prend en charge le partitionnement de la liste de révocation de certificats via l’extension « 2.5.29.28 » (point de distribution émettrice) ajoutée à la liste de révocation de certificats téléchargée. Pour plus d’informations sur la façon dont Crypt32 prend en charge le partitionnement de la liste de révocation de certificats via cette extension, consultez la section Partitionnement de la liste de révocation de certificats .
L’autorité de certification envisage de supprimer la prise en charge d’OCSP et de prendre uniquement en charge les listes de révocation en ligne doivent prendre en compte l’impact que cela aura sur les applications appelant l’API CertGetCertificateChain avec la révocation en ligne activée :
- Lors de la première validation, l’application appelante effectue un téléchargement de liste de révocation de certificats à la demande et empêche l’API de se terminer jusqu’à ce que la liste de révocation de certificats soit téléchargée.
- Pour les serveurs TLS de volume élevé, il y aura des téléchargements de volume élevé correspondants à partir du serveur de liste de révocation de certificats de l’autorité de certification.
- Si la liste de révocation de certificats devient volumineuse, elle aura un impact direct sur le serveur capable de gérer un volume élevé de téléchargements.
- La taille de la liste de révocation de certificats peut être limitée en prenant en charge les listes de révocation de certificats partitionnés.
- Les validations suivantes utilisent la liste de révocation de certificats mise en cache jusqu’à l’expiration de la liste de révocation de certificats. Lorsque la liste de révocation de certificats expire, la liste ci-dessus est répétée pour la validation suivante.
- Ce téléchargement de liste de révocation de certificats à la demande peut être évité en ajoutant l’extension Next CRL Publish.
Les sections suivantes fournissent des informations sur la pré-extraction et le partitionnement de la liste de révocation de certificats pour améliorer les performances de révocation en ligne où seules les listes de révocation de certificats sont utilisées.
Pré-extraction de liste de révocation de certificats
Une liste de révocation de certificats encodée comporte les deux champs suivants indiquant quand la liste de révocation de certificats a été publiée et combien de temps le client peut mettre en cache avant de devoir récupérer la liste de révocation de certificats publiée suivante.
ThisUpdate GeneralizedTime,
NextUpdate GeneralizedTime OPTIONAL,
Si NextUpdate est manquant, il s’agit de la dernière liste de révocation de certificats à publier et n’expirera jamais.
Une liste de révocation de certificats peut contenir l’extension « 1.3.6.1.4.311.21.4 » (publication de la liste de révocation de certificats suivante) qui est également encodée en tant que GeneralizedTime. Lorsque cette extension est présente, Crypt32 tente de pré-extraire la liste de révocation de certificats publiée suivante après cette publication PublishTime et avant NextUpdate comme suit :
Donné, PublishPeriod = NextUpdate – PublishTime
. Les trois paramètres de configuration suivants sont utilisés pour déterminer le début et la fin du PreFetchPeriod :
- AfterPublishPreFetchDivisor
- Le début du PreFetchPeriod est retardé après le PublishTime en divisant le PublishPeriod par ce diviseur.
- Valeur par défaut de 10
- BeforeNextUpdatePreFetchDivisor
- La fin du PreFetchPeriod se produit avant NextUpdate en divisant le PublishPeriod par ce diviseur.
- Valeur par défaut de 20
- MinPreFetchPeriod
- Donné,
PreFetchPeriod = PreFetchPeriodFinishTime – PreFetchPeriodStartTime
. La pré-extraction est activée uniquement si le PreFetchPeriod dépasse ce minimum. - Valeur par défaut de 1 heure
- Donné,
Compte tenu du calcul ci-dessus de PreFetchPeriod, une heure aléatoire est choisie dans ce PreFetchPeriod pour chaque client afin de pré-extraire et télécharger la liste de révocation de certificats publiée à partir du serveur.
Voici quelques exemples de fois et le PreFetchPeriod correspondant à l’aide des valeurs de configuration par défaut.
La liste de révocation de certificats est valide pendant deux jours et publiée tous les jours :
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.
La liste de révocation de certificats est valide pendant huit jours et publiée tous les quatre jours :
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
Remarque
Si la liste de révocation de certificats pré-extraite n’est pas utilisée par le client, la pré-extraction ci-dessus est arrêtée jusqu’à ce que le client lance un nouveau téléchargement à la demande pour cette liste de révocation de certificats.
Partitionnement de liste de révocation de certificats
Cette section fournit des informations sur la façon dont Crypt32 prend en charge le partitionnement de la liste de révocation de certificats.
Exemple
Voici un exemple d’extension CDP et fournisseur d’identité couramment mise en forme utilisée pour le partitionnement de liste de révocation de certificats.
Pour la première partition de certificats émis par l’autorité de certification :
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
Pour la deuxième partition de certificats émis par l’autorité de certification, pointe vers une autre liste de révocation de certificats dans le fournisseur de services et le fournisseur d’identité :
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
Comme vous pouvez le voir, la même URL de liste de révocation de certificats http unique est utilisée dans le CDP et le fournisseur d’identité. En outre, les listes de révocation de certificats partitionnés sont directement signées par l’autorité de certification et s’appliquent aux certificats des utilisateurs finaux et des autorités de certification.
La section suivante fournit des détails sur l’encodage ASN.1 des extensions IDP et CDP et ce qui est pris en charge par Crypt32.
Détails
Il s’agit de l’ASN.1 pour l’extension de point de distribution émettrice (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
}
Si une liste de révocation de certificats a un fournisseur d’identité, le client Windows se poursuit comme suit :
- Ignorer les fournisseurs d’identité ayant :
- onlySomeReasons
- indirectCRL
- Prend uniquement en charge les fournisseurs d’identité avec le choix fullName .
- Le CRL CDP doit également avoir le choix fullName.
- Si onlyContainsUserCerts ou onlyContainsCACerts :
- Utilisez l’extension de contraintes de base du certificat pour déterminer si le fournisseur d’identité s’applique au certificat.
Il s’agit de l’ASN.1 pour l’extension CDP dans un certificat :
--------------------------------------------
-- 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 :
- Effectuez une itération dans la séquence d’IDP de GeneralNames jusqu’à ce qu’une correspondance avec un nom CDP :
- Effectuez une itération dans la séquence de DistributionPoints du CDP :
- Ignorez le point de distribution CDP ayant :
- Raisons
- cRLIssuer
- Ignorez CDP DistributionPoint s’il n’a pas de choix fullName pour DistributionPointName.
- Itérer dans la séquence de CDP de GeneralNames :
- Vérifiez si IDP et CDP GeneralName correspondent
- Si IsSameGeneralName(), nous avons une correspondance et la liste de révocation de certificats peut être utilisée pour le certificat d’objet.
- Vérifiez si IDP et CDP GeneralName correspondent
- Ignorez le point de distribution CDP ayant :
- Effectuez une itération dans la séquence de DistributionPoints du CDP :
IsSameGeneralName(IDP_GeneralName, CDP_GeneralName)
Le fournisseur d’identité et le CDP doivent avoir le même choix GeneralName . Pour le même choix, comparez le nom du fournisseur d’identité et du fournisseur de services en fonction du choix :
- rfc822Name
- Comparaison de chaînes ne respectant pas la casse. Pas de normalisation de caractère % .
- dNSName
- Comparaison de chaînes ne respectant pas la casse. Pas de normalisation de caractère % .
- uniformResourceLocator (URL)
- Comparaison de chaînes ne respectant pas la casse. Pas de normalisation de caractère % .
- otherName
- Les valeurs binaires spécifiques à l’OID et OID sont comparées.
- registeredID
- Les OID sont comparés.
- directoryName
- Les octets de nom encodés sont comparés.
- iPAddress
- Les octets OCTET encodés sont comparés.
- x400Address
- Non pris en charge.
- ediPartyName
- Non pris en charge.
L’attente est que le choix uniformResourceLocator GeneralName sera utilisé.