Vous trouverez ci-dessous une explication sur la manière dont sont générés les numéros de série des certificats délivrés et sur la manière dont le comportement des autorités de certification peut être adapté.
Le comportement de génération de numéros de série pour les certificats émis est contrôlé par la clé de registre suivante :
HKLM\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\{Name-der-Zertifizierungsstelle}\HighSerial
La commande suivante permet de consulter la configuration actuelle :
certutil -getreg CA\HighSerial

Possibilités de configuration
Les possibilités de configuration suivantes sont disponibles :
- HighSerial défini sur REG_DWORD = 0
- HighSerial réglé sur REG_DWORD entre 1 et 0x7f (127)
- HighSerial défini sur REG_DWORD = 0xffffffff
- HighSerial défini sur une valeur hexadécimale comme REG_SZ
Informations de fond
Connaissez-vous TameMyCerts? TameMyCerts est un add-on pour l'autorité de certification Microsoft (Active Directory Certificate Services). Il étend la fonction de l'autorité de certification et permet de Application de la réglementationIl s'agit d'un logiciel de gestion des certificats qui permet d'automatiser l'émission de certificats en toute sécurité. TameMyCerts est unique dans l'écosystème Microsoft, a déjà fait ses preuves dans d'innombrables entreprises du monde entier et est disponible sous une licence libre. Il peut téléchargé via GitHub et être utilisé gratuitement. Une maintenance professionnelle est également proposée.
Pour comprendre le fonctionnement des différentes options, nous allons d'abord expliquer brièvement les trois fonctions utilisées.
GetTickCount
Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days.
La valeur de retour est le nombre de millisecondes qui se sont écoulées depuis que le système a été lancé.
La fonction renvoie le temps écoulé depuis le démarrage du système d'exploitation en millisecondes, jusqu'à une valeur maximale de 49,7 jours.
UShort
Contient des entiers non signés de 16 bits (2 octets) dont la valeur va de 0 à 65,535.
Le type de données UShort peut prendre les valeurs 0 à 65535.
CryptGenRandom
Le site CryptGenRandom remplit une mémoire tampon avec des octets cryptographiquement aléatoires.
La fonction CryptGenRandom renvoie des nombres aléatoires.
HighSerial REG_DWORD = 0
Il s'agit de la configuration par défaut pour toutes les autorités de certification jusqu'à Windows Server 2008 R2. Les numéros de série générés auront une longueur de 10 octets et se composeront comme suit :
DWORD GetTickCount() +
UShort (Schlüsselindex des Zertifizierungsstellenzertifikats) +
DWORD RequestId
Comme il n'y a pas de composante aléatoire réelle, ces numéros de série sont prévisibles, ce qui facilite une attaque sur un algorithme de signature non sécurisé (par exemple MD5 et SHA-1) (et, dans le cas de Flame, a été réalisée avec succès). C'est la raison pour laquelle les autorités de certification se comportent différemment à partir de Windows Server 2012.
Exemple
610dde5a000000000003
Après que le certificat de l'autorité de certification a été renouvelé avec une nouvelle clé, on voit que le bit correspondant a changé :
6154e9cb000100000007
HighSerial réglé sur REG_DWORD entre 1 et 0x7f (127)
Il s'agit du paramètre par défaut pour toutes les autorités de certification à partir de Windows Server 2012 (mais pas si elles ont été configurées via Mise à niveau en place à partir d'un système d'exploitation antérieur a été mis à jour à ce niveau de version). Les numéros de série générés auront une longueur de 19 octets et se composeront comme suit :
BYTE der konfigurierte Registry-Wert +
DWORD RequestId +
8 Bytes CryptGenRandom Daten +
UShort (Schlüsselindex des Zertifizierungsstellenzertifikats) +
DWORD RequestId
Les données aléatoires sont renouvelées pour chaque certificat émis, de sorte que les numéros de série générés ne sont pas prévisibles.
Les numéros de série ont en outre un préfixe, qui peut être utilisé par exemple pour la Audit des requêtes OCSP peut être évalué.
Exemple
HighSerial est défini sur REG_DWORD = 3b (59). Comme on peut le voir, le numéro de série commence par cette valeur.
3b000000031e83d411d8bcef0f000000000003
HighSerial défini sur REG_DWORD = 0xffffffff
Lorsque l'autorité de certification tente de générer le premier numéro de série, un nombre aléatoire de 8 octets est généré à l'aide de la fonction CryptGenRandom et stocké dans la valeur HighSerial. Les numéros de série générés auront une longueur de 14 octets et se composeront comme suit :
8 Bytes die zuvor generierten CryptGenRandom Daten aus HighSerial +
UShort (Schlüsselindex des Zertifizierungsstellenzertifikats) +
DWORD RequestId
Comme les 8 octets de données aléatoires ne sont générés que lors de la première émission d'un certificat, ces numéros de série sont prévisibles. Cette option ne devrait donc pas être utilisée.
Exemple
16a28b7e63099507000000000004
La valeur aléatoire générée à l'aide de CryptGenRandom est inscrite dans la valeur HighSerial en tant que REG_SZ (chaîne de caractères) :

Highserial défini sur une valeur hexadécimale comme REG_SZ
Il est possible de saisir une valeur hexadécimale de 1 à 13 octets de type REG_SZ dans la valeur HighSerial. Les numéros de série générés auront - selon la longueur de la valeur configurée - une longueur de 7 à 19 octets et se composent comme suit :
1 bis 13 Bytes der in HighSerial eingetragenen Daten +
UShort (Schlüsselindex des Zertifizierungsstellenzertifikats) +
DWORD RequestId
Cette option ne contient pas non plus de fonction de génération de valeurs aléatoires et donne donc des numéros de série prévisibles. Elle ne doit donc pas être utilisée.
Valeurs par défaut
| Système d'exploitation | Valeur par défaut |
|---|---|
| Windows Server 2003 Windows Server 2008 Windows Server 2008 R2 | REG_DWORD = 0 |
| Windows Server 2012 Windows Server 2012 R2 Windows Server 2016 Windows Server 2019 | REG_DWORD généré aléatoirement entre 1 et 0x7f (127) |
Conclusion
Du point de vue de la sécurité, il faut toujours choisir la configuration avec la part aléatoire la plus élevée. Cela correspond à l'option de définir la valeur HighSerial en tant que REG_DWORD sur une valeur comprise entre 1 et 0x7f (127), comme c'est le cas par défaut depuis Windows Server 2012.
Pour les systèmes qui utilisent des Mise à niveau en place ont migré vers Windows Server 2012 ou plus récent, il peut être utile de définir la valeur HighSerial sur la nouvelle norme.
Pour les systèmes qui ont été migrés vers un serveur équipé d'un nouveau système d'exploitation, Il convient de décider activement si l'on souhaite participer à l'action de l'association. Importation de l'enregistrement reprend la valeur de l'ancien système ou la laisse avec le nouveau réglage.
Toutefois, il est également possible d'élever les autorités de certification qui fonctionnent sur Windows Server 2008 et Windows Server 2008 R2 déjà à la nouvelle valeur par défaut de Windows Server 2012.
Liens complémentaires :
- Migration d'une autorité de certification intégrée à Active Directory (Enterprise Certification Authority) vers un autre serveur
- Mise à niveau sur place d'une autorité de certification de Windows Server 2008 SP2 vers Windows Server 2008 R2
- Mise à niveau sur place d'une autorité de certification de Windows Server 2008 SP2 vers Windows Server 2012
- Mise à niveau sur place d'une autorité de certification de Windows Server 2008 R2 vers Windows Server 2012 R2
- Mise à niveau en place d'une autorité de certification de Windows Server 2012 R2 ou 2016 vers Windows Server 2019
Sources externes
- Configurer la génération de numéros de série (Microsoft)
- Algorithmes de génération de numéros de série de certificats ADCS - un guide complet (PKI Solutions, Inc.)
- Fonction GetTickCount (Microsoft)
- UShort data type (Visual Basic) (Microsoft)
- Fonction CryptGenRandom (Microsoft)
Les commentaires sont fermés.