Codage des caractères dans le Subject Distinguished Name des demandes de certificat et des certificats délivrés

Habituellement, le codage des caractères et des chaînes de caractères dans les certificats n'est pas un sujet qui intéresse beaucoup les utilisateurs d'une PKI. Il existe cependant des cas où les paramètres par défaut de l'autorité de certification ne donnent pas les résultats escomptés.

Für die Relative Distinguished Names (RDNs) innerhalb des Subject Distiguished Name (Subject DN), welcher als Typ „DirectoryString“ abgebildet ist, sieht das einschlägige RFC 5280 folgende Varianten für die Abbildung von Zeichenketten vor.

DirectoryString ::= CHOICE {
         teletexString           TeletexString (SIZE (1..MAX)),
         printableString         PrintableString (SIZE (1..MAX)),
         universalString         UniversalString (SIZE (1..MAX)),
         utf8String              UTF8String (SIZE (1..MAX)),
         bmpString               BMPString (SIZE (1..MAX)) }

Bei näherer Betrachtung zeigt sich jedoch, dass überwiegend nur zwei der fünf möglichen Datentypen von Relevanz sind:

CAs conforming to this profile MUST use either the PrintableString or UTF8String encoding of DirectoryString […].

RFC 5280

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.

Im Kontext relevante Kodierungen

Für uns als Nutzer einer Microsoft-PKI sind in der Regel folgende Kodierungen, bzw. Begrifflichkeiten von Interesse:

TypeAbbildungDescription
ASN.1 PrintableStringprintableStringUntermenge des ASCII-Zeichensatzes (nur „druckbare“ Zeichen). Nur wenige Sonderzeichen abbildbar, z.B. keine trémas.
UnicodebmpStringInternationaler Standard für Kodierung von Zeichenketten (Strings).
Flexible Kodierung der enthaltenen Zeichen, kann unter anderem UTF-8 oder UTF-16 verwenden. Windows interpretiert Unicode als UTF-16, Linux als UTF-8, was zu unterschiedlichem Verhalten führen kann.
UTF-8utf8StringEine von mehreren Möglichkeiten, Zeichen in Unicode-Zeichenketten abzubilden.

Der countryName RDN soll lediglich die in ISO3166 spezifizierte zweistelligen Ländercodes beinhalten, die sich immer aus ASCII Zeichen zusammensetzen und wird daher immer als ASN.1 PrintableString kodiert, da kein Bedarf an einer erweiterten Kodierung besteht.

Inspizieren von Zertifikaten und Zertifikatanforderungen

Sowohl für Zertifikate als auch Zertifikatanforderungen kann relativ einfach überprüft werden, welche Kodierungen die jeweiligen RDNs verwenden.

certutil -asn {Dateiname}

Eine komfortablere Möglichkeit bietet der ASN.1 Editor von PKI Solutions.

Beispiel printableString

Beispiel bmpString (Unicode)

Beispiel utf8String

Die Einstellungen

Microsoft Active Directory Certificate Services bietet die Möglichkeit, auf die Kodierung von Zeichen und Zeichenkodierungen im Rahmen der Zertifikatausstellung Einfluss zu nehmen. Die entsprechenden Einstellungen finden sich in folgendem Registrierungs-Schlüssel auf der Zertifizierungsstelle:

HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\{Common-Name-der-Zertifizierungsstelle}\ForceTeletex

Die Einstellungen in ForceTeletex werden durch das Flag CRLF_REBUILD_MODIFIED_SUBJECT_ONLY (unter CA\CRLFlags), welches bewirkt, dass der beantragte Subject DN 1:1 in das ausgestellte Zertifikat übernommen wird, außer Kraft gesetzt.

Ausgelesen können die gesetzten Flags mit folgendem Kommandozeilenbefehl:

certutil -v -getreg CA\ForceTeletex

Einzelne Flags können mit folgenden Kommandozeilenbefehlen aktiviert werden:

 certutil -setreg CA\ForceTeletex +{FLAG}

Ebenso können Flags auch deaktiviert werden.

certutil -setreg CA\ForceTeletex -{FLAG}

Le service d'autorité de certification doit ensuite être redémarré pour que les modifications soient appliquées.

Folgende Flags können gesetzt werden. Sie entscheiden dann darüber, welche Flags beim Kodieren eines RDN an die Funktion CryptEncodeObjectEx weitergegeben werden.

DrapeauValeurStandardmäßig aktiviert (Windows 2012 bis 2022)
ENUM_TELETEX_OFF0non
ENUM_TELETEX_ON1non
ENUM_TELETEX_AUTO2oui
ENUM_TELETEX_MASK0xFnon
ENUM_TELETEX_UTF80x10oui
ENUM_TELETEX_FORCEUTF80x20non

ENUM_TELETEX_UTF8 (0x10)

Ist dieses Flag aktiviert, wird an CryptEncodeObjectEx das Flag CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG übergeben.

This flag is applicable when encoding an X509_UNICODE_NAME. When set, CERT_RDN_UTF8_STRING is selected instead of CERT_RDN_UNICODE_STRING.

Ainsi, ce paramètre a pour effet que pour une demande de certificat soumise pour laquelle un RDN est codé en Unicode (...et donc l'interprétation du codage des caractères n'est pas univoque), le codage des caractères UTF-8 est utilisé dans le certificat émis lorsque le drapeau est activé pour le RDN.

En revanche, si un RDN est encodé en printableString, cet encodage est conservé dans le certificat délivré.

ENUM_TELETEX_FORCEUTF8 (0x20)

Ist dieses Flag aktiviert, wird an CryptEncodeObjectEx transmettre le drapeau CRYPT_UNICODE_NAME_ENCODE_FORCE_UTF8_UNICODE_FLAG.

Cet indicateur est applicable lors de l'encodage d'un X509_UNICODE_NAME. Lorsqu'il est activé, CERT_RDN_UTF8_STRING est sélectionné à la place de CERT_RDN_PRINTABLE_STRING pour les types de chaînes de répertoire. Aussi, cet indicateur permet CRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAG.

Si l'indicateur est activé, il active aussi automatiquement l'effet de ENUM_TELETEX_UTF8.

Ainsi, ce paramètre a pour effet que pour une demande de certificat soumise, le codage de caractères UTF-8 est en principe utilisé dans le certificat délivré.

Contrairement à la documentation originale de Microsoft, il est aussi possible de Conformité à ISIS-MTT ou Common PKI pas nécessaire d'activer l'indicateur ENUM_TELETEX_FORCEUTF8.

Tester le comportement

Pour le tester, le PSCertificateEnrollment Module PowerShell très bien. Par défaut, il utilise ASN.1 PrintableString ou Unicode si le RDN contient des caractères correspondants. Un commutateur pour utiliser UTF-8 est également disponible.

# Ergebnis: printableString (PRINTABLE_STRING)
New-CertificateRequest -Subject "CN=Max Meier"

# Ergebnis: bmpString (UNICODE_STRING)
New-CertificateRequest -Subject "CN=Max Müller"

# Ergebnis: utf8String (UTF8_STRING)
New-CertificateRequest -Subject "CN=Max Meier" -SubjectEncoding utf8

# Ergebnis: utf8String (UTF8_STRING)
New-CertificateRequest -Subject "CN=Max Müller" -SubjectEncoding utf8

Les tests ont abouti aux résultats suivants :

Codage dans la demande de certificatContient des caractères spéciaux...drapeau UTF8 activé...FORCEUTF8 Flag activéCodification dans le certificat délivré
printableStringnonnonnonprintableString
printableString nonouinonprintableString
printableString nonnonoui utf8String
printableString nonouiouiutf8String
bmpString (Unicode)ouinonnonbmpString (Unicode)
bmpString (Unicode) ouiouinonutf8String
bmpString (Unicode) ouinonoui utf8String
bmpString (Unicode) ouiouiouiutf8String
utf8StringnonnonnonbmpString (Unicode)
utf8Stringouinonnonutf8String
utf8Stringnonouinonutf8String
utf8String nonnonouiutf8String
utf8Stringnonouiouiutf8String

Les tests confirment donc le comportement documenté et attendu en conséquence.

Il est donc également important de savoir comment la demande de certificat entrante est codée. Par exemple certreq.exe et la Microsoft Management Console (MMC) codifient automatiquement tous les RDN (à l'exception du countryName) en UTF-8. En conséquence, le RDN dans le certificat délivré sera également codé en UTF-8 dans la plupart des cas.

Modifier le comportement pour certreq.exe

Si une demande de certificat est créée à l'aide de certreq.exe, il est possible d'utiliser la commande X500NameFlags peut être utilisée pour forcer un retour à printableString ou Unicode.

Pour ce faire, la ligne suivante est inscrite dans le fichier .inf correspondant :

[NewRequest]
X500NameFlags = 0x100000 # CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG

Problèmes de compatibilité

Certaines applications ne comprennent pas non plus l'UTF-8

Le site recommandations originales de Microsoft de l'année 2003 pour la conformité à ISIS-MTT ou Common PKI Standard forcent l'utilisation d'UTF8 même si le Subject Relative Distinguished Name (RDN) en question ne l'exige pas du tout.

Le Common PKI Standard indique explicitement les problèmes de compatibilité possibles avec UTF-8 et, comme il le montre, il y a avec Contrôle des applications Windows Defender (WDAC) au moins un produit Microsoft, qui n'est pas non plus compatible avec celui-ci.

Un échec de démarrage (écran bleu) peut se produire si votre certificat de signature ne suit pas ces règles :
[...]
Ne pas utiliser l'encodage UTF-8 pour les champs de certificat, tels que ’nom commun du sujet‘ et ‚nom commun de l'émetteur‘. Ces chaînes doivent être encodées en PRINTABLE_STRING, IA5STRING ou BMPSTRING.

Utiliser les politiques signées pour protéger le contrôle des applications Windows Defender contre les tentatives de fraude (Microsoft Corpotation)

Il est donc important ici que pour le certificat de signature WDAC, la demande de certificat soit déjà créée avec le codage correct, uniquement avec des caractères ASCII dans le RDN et non avec un outil qui utilise par défaut UTF-8 pour le codage des RDN.

L'autorité de certification ne doit pas avoir activé le drapeau ENUM_TELETEX_FORCEUTF8 lors de la délivrance du certificat. De même, les RDNs pour Subject DN et Issuer DN doivent être des certificats d'autorité de certification ne doivent pas être codés en UTF-8 dans la chaîne de certificats.

Pour le Subject DN et l'Issuer DN de tous les certificats de la chaîne de certificats, il faut en outre qu'aucun caractère qui ne peut pas être représenté avec ASN.1 PrintableString ne soit contenu. Cela exclut par exemple l'utilisation de caractères spéciaux tels que trémas de.

La formation de la chaîne de certificats (ne serait) plus possible

Pour les autorités de certification qui émettent d'autres certificats d'autorité de certification, il convient (si l'on a l'intention de renouveler les certificats d'une autorité de certification avec la même clé au lieu de fournir une nouvelle autorité de certification en remplacement) de ne pas modifier le comportement de codage des caractères pour les certificats émis, car les autorités de certification risquent de ne pas accepter les certificats délivrés.

Conclusion

En résumé, les paramètres par défaut de l'autorité de certification Microsoft garantissent automatiquement que les certificats émis sont compatibles avec le RFC 5280, ISIS-MTT et Common PKI. Une modification des paramètres est certes recommandée de temps à autre, mais elle n'est généralement pas nécessaire.

Fonctionnement résumé dans la configuration par défaut

Les paramètres par défaut peuvent être grossièrement résumés comme suit :

  • Si un RDN est codé en printableString dans la demande de certificat soumise, il l'est également dans le certificat délivré.
  • Si un RDN est codé en UTF-8 dans la demande de certificat soumise, il l'est également dans le certificat délivré.
  • Si un RDN est codé en Unicode dans la demande de certificat soumise, il sera codé en UTF-8 dans le certificat délivré.

Liens complémentaires :

Sources externes

Les commentaires sont fermés.

fr_FRFrançais