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.
Pour les Relative Distinguished Names (RDN) au sein du Subject Distiguished Name (Subject DN), qui est représenté comme type „DirectoryString“, le RFC 5280 correspondant prévoit les variantes suivantes pour la représentation des chaînes de caractères.
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)) }
En y regardant de plus près, on constate toutefois que seuls deux des cinq types de données possibles sont pertinents :
Les AC conformes à ce profil DOIVENT utiliser soit l'encodage PrintableString soit l'encodage UTF8String de 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.
Codages pertinents dans le contexte
Pour nous, en tant qu'utilisateurs d'une ICP Microsoft, les codifications ou les notions suivantes sont généralement intéressantes :
| Type | Illustration | Description |
|---|---|---|
| ASN.1 PrintableString | printableString | Sous-ensemble du jeu de caractères ASCII (uniquement des caractères „imprimables“). Seuls quelques caractères spéciaux peuvent être représentés, par exemple aucun trémas. |
| Unicode | bmpString | Norme internationale pour le codage des chaînes de caractères (strings). Codage flexible des caractères contenus, peut utiliser entre autres UTF-8 ou UTF-16. Windows interprète Unicode comme UTF-16, Linux comme UTF-8, ce qui peut entraîner des comportements différents. |
| UTF-8 | utf8String | Une des nombreuses possibilités de mapper des caractères dans des chaînes de caractères Unicode. |
Le countryName RDN doit uniquement contenir les codes de pays à deux chiffres spécifiés dans ISO3166, qui sont toujours composés de caractères ASCII, et est donc toujours codé en tant que ASN.1 PrintableString, car il n'y a pas besoin d'un codage étendu.
Inspection des certificats et des demandes de certificats
Tant pour les certificats que pour les demandes de certificats, il est relativement facile de vérifier quels codages sont utilisés par les RDN concernés.
certutil -asn {Dateiname}
Une possibilité plus confortable est offerte par le Éditeur ASN.1 de PKI Solutions.
Exemple printableString

Exemple bmpString (Unicode)

Exemple utf8String

Les réglages
Microsoft Active Directory Certificate Services offre la possibilité d'influencer le codage des caractères et l'encodage des caractères dans le cadre de l'émission de certificats. Les paramètres correspondants se trouvent dans la clé d'enregistrement suivante sur l'autorité de certification :
HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\{Common-Name-der-Zertifizierungsstelle}\ForceTeletex
Les paramètres de ForceTeletex sont indiqués par le drapeau CRLF_REBUILD_MODIFIED_SUBJECT_ONLY (sous CA\CRLFlags), qui a pour effet que le Subject DN demandé est repris 1:1 dans le certificat délivré, est annulé.
Les indicateurs définis peuvent être lus à l'aide de la commande de ligne de commande suivante :
certutil -v -getreg CA\ForceTeletex

Les indicateurs individuels peuvent être activés à l'aide des commandes de ligne de commande suivantes :
certutil -setreg CA\ForceTeletex +{FLAG}
De même, les drapeaux peuvent être désactivés.
certutil -setreg CA\ForceTeletex -{FLAG}
Le service d'autorité de certification doit ensuite être redémarré pour que les modifications soient appliquées.
Les indicateurs suivants peuvent être définis. Ils décident ensuite des indicateurs à envoyer à la fonction lors de l'encodage d'un RDN. CryptEncodeObjectEx être transmis.
| Drapeau | Valeur | Activé par défaut (Windows 2012 jusqu'en 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)
Si ce drapeau est activé, il est envoyé à CryptEncodeObjectEx transmettre le drapeau CRYPT_UNICODE_NAME_ENCODE_ENABLE_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_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)
Si ce drapeau est activé, il est envoyé à 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.