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:
| Type | Abbildung | Description |
|---|---|---|
| ASN.1 PrintableString | printableString | Untermenge des ASCII-Zeichensatzes (nur „druckbare“ Zeichen). Nur wenige Sonderzeichen abbildbar, z.B. keine trémas. |
| Unicode | bmpString | Internationaler 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-8 | utf8String | Eine 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.
| Drapeau | Valeur | Standardmäßig aktiviert (Windows 2012 bis 2022) |
|---|---|---|
| ENUM_TELETEX_OFF | 0 | non |
| ENUM_TELETEX_ON | 1 | non |
| ENUM_TELETEX_AUTO | 2 | oui |
| ENUM_TELETEX_MASK | 0xF | non |
| ENUM_TELETEX_UTF8 | 0x10 | oui |
| ENUM_TELETEX_FORCEUTF8 | 0x20 | non |
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 certificat | Contient des caractères spéciaux | ...drapeau UTF8 activé | ...FORCEUTF8 Flag activé | Codification dans le certificat délivré |
|---|---|---|---|---|
| printableString | non | non | non | printableString |
| printableString | non | oui | non | printableString |
| printableString | non | non | oui | utf8String |
| printableString | non | oui | oui | utf8String |
| bmpString (Unicode) | oui | non | non | bmpString (Unicode) |
| bmpString (Unicode) | oui | oui | non | utf8String |
| bmpString (Unicode) | oui | non | oui | utf8String |
| bmpString (Unicode) | oui | oui | oui | utf8String |
| utf8String | non | non | non | bmpString (Unicode) |
| utf8String | oui | non | non | utf8String |
| utf8String | non | oui | non | utf8String |
| utf8String | non | non | oui | utf8String |
| utf8String | non | oui | oui | utf8String |
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 :
Utiliser les politiques signées pour protéger le contrôle des applications Windows Defender contre les tentatives de fraude (Microsoft Corpotation)
[...]
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.
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 :
- Utilisation de noms distinctifs relatifs (RDN) non définis dans les certificats délivrés
- Description des paramètres de configuration nécessaires pour le profil de certificat "Common PKI".
- Accents dans les certificats d'autorité de certification
- L'installation d'un nouveau certificat d'autorité de certification échoue avec le code d'erreur "ERROR_INVALID_PARAMETER".
Sources externes
- Fonction CryptEncodeObjectEx (wincrypt.h) (Microsoft Corporation)
- Structure CERT_RDN_ATTR (wincrypt.h) (Microsoft Corporation)
- UIT T.61 (Wikipedia)
- Unicode (Wikipedia)
- Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (Internet Engineering Task Force, IETF)
- Quelle est la différence entre UTF-8 et Unicode ? (discussion sur Stack Overflow)
- Différence entre CaPolicy.inf avec ForceUTF8=1 versus certutil -setreg ca\forceteletex +0x20 (discussion sur les forums Microsoft TechNet)
Les commentaires sont fermés.