Comment est formé le numéro de série d'un certificat ?

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'exploitationValeur 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 :

Sources externes

Les commentaires sont fermés.

fr_FRFrançais