Modifier le Subject Alternative Name (SAN) d'un certificat avant son émission - mais en toute sécurité !

En réseau circulent malheureusement beaucoup sur beaucoup de Instructions (même les grands acteurs n'en sont pas excluspas même Microsoft lui-même ou le Grand Maître Komar), qui recommandent fatalement que le drapeau EDITF_ATTRIBUTESUBJECTALTNAME2 sur l'autorité de certification - soi-disant pour être en mesure d'émettre des certificats avec l'extension Subject Alternative Name (SAN) pour les demandes de certificats faites manuellement.

Malheureusement, cette approche n'est pas seulement inutile, elle a aussi quelques effets secondaires désagréables, qui peuvent, dans le pire des cas, permettre à un attaquant de prendre le contrôle de l'ensemble de la structure Active Directory..

Pour cette raison, le Module de politique TameMyCerts pour Microsoft Active Directory Certificate ServicesSi l'option est activée, l'application peut détecter, rejeter et consigner de telles tentatives :

Comment puis-je ajouter l'extension SAN de manière sécurisée (ultérieurement) à une demande de certificat ?

Il est évidemment préférable que les noms alternatifs fassent déjà partie de la demande de certificat initiale (Certificate Signing Request, CSR). La procédure pour la création de demandes de certificat correspondantes sous Windows est décrite en détail dans l'article "Demande manuelle d'un certificat de serveur web" décrit.

Malheureusement, cette procédure n'est pas possible avec tous les systèmes, de sorte qu'il peut être nécessaire d'ajouter ultérieurement des entrées SAN à une demande de certificat.

La demande de certificat elle-même ne peut malheureusement plus être traitée ultérieurement, car elle est signée avec la clé privée du demandeur. Il ne reste donc que la possibilité d'influencer le processus d'émission de l'autorité de certification avant que celle-ci ne délivre le certificat.

Les possibilités "sûres" suivantes s'offrent donc pour ajouter ultérieurement des noms alternatifs à une demande de certificat et les faire ainsi figurer dans le certificat qui en résulte :

  • On emballe la demande de certificat originale dans une couche CMC signée, qui contient les noms alternatifs.
  • On soumet le modèle de certificat correspondant à l'approbation d'un gestionnaire de certificats et on définit les noms alternatifs après avoir soumis la demande de certificat via les interfaces administratives de l'autorité de certification.
  • On utilise le Module de politique TameMyCerts pour Microsoft Active Directory Certificate Services.

Toutes les procédures ont en commun le fait qu'elles sont effectuées par un gestionnaire de certificats ou par l'autorité de certification elle-même, car elles reposent sur une délivrance qui diffère de la demande de certificat initiale.

Les différentes méthodes sont décrites ci-dessous à l'aide de l'exemple d'un certificat de serveur web dont la demande de certificat doit recevoir des noms alternatifs supplémentaires sous forme de noms DNS.

La demande de certificat ne contient qu'un nom commun, mais pas d'extension de certificat Subject Alternative Name (SAN).

Ajouter une extension de certificat SAN ultérieurement via une couche CMC

Cette méthode fonctionne aussi bien avec les modèles de certificats configurés pour émettre directement le certificat résultant qu'avec ceux qui nécessitent l'approbation d'un gestionnaire de certificats.

Dans ce cas, la demande de certificat initiale est Gestion des certificats via CMS (CMC, RFC 5272) message conditionné. L'extension SAN fait partie de la couche CMC.

La signature de la couche CMC avec le certificat d'un agent d'enregistrement (ou celui de l'autorité de certification) permet de garantir une authentification par un gestionnaire de certificats (supposé) autorisé.

Pour plus de détails, voir aussi l'article "Principes de base : Enroll on Behalf of (EOBO)„ .

Il faut d'abord créer un fichier de définition avec le contenu suivant.

[Version]
Signature = "$Windows NT$"

[Strings]
szOID_SUBJECT_ALT_NAME2 =  "2.5.29.17"

[Extensions]
%szOID_SUBJECT_ALT_NAME2% = "{text}"
_continue_ = "DNS=ein-dns-name.adcslabor.de&"
_continue_ = "DNS=noch-ein-dns-name.adcslabor.de&"

Le fichier de définitions peut maintenant être appliqué à la demande de certificat.

certreq -policy {Dateiname-Definitions-Datei} {Dateiname-Zertifikatanforderung} {Dateiname-Signierte-Zertifikatanforderung}

La demande de certificat initiale est maintenant emballée dans une couche CMC qui contient les informations supplémentaires. Celle-ci doit être signée par un gestionnaire de certificats.

Il est également possible d'utiliser le certificat d'autorité de certification. Dans la mesure du possible, le processus ne doit toutefois pas être effectué directement sur le serveur de l'autorité de certification, de sorte que cela ne convient pas à une utilisation productive.

Nous pouvons maintenant inspecter le fichier résultant.

certutil -dump {Dateiname-Signierte-Zertifikatanforderung}

Nous pouvons voir ici que la demande de certificat initiale fait partie d'une couche d'imbrication. Les noms alternatifs font partie de la couche CMC de niveau supérieur.

La demande de certificat emballée peut maintenant être envoyée à l'autorité de certification.

certreq -submit {Dateiname-Signierte-Zertifikatanforderung}

Le site Module de politique TameMyCerts pour Microsoft Active Directory Certificate Services intervient après le module Windows Default Policy et est donc en mesure de reconnaître également les contenus ajoutés ultérieurement par ce biais et d'appliquer des règles à ces contenus.

Le certificat qui en résulte contiendra alors les noms DNS souhaités.

Ajouter ultérieurement une extension de certificat SAN via les interfaces d'administration de l'autorité de certification

Cette méthode ne fonctionne que pour les modèles de certificats qui nécessitent l'approbation d'un gestionnaire de certificats, le certificat qui en résulte n'est donc pas délivré directement. Elle peut être effectuée localement ou à distance contre l'autorité de certification.

L'utilisateur exécutant doit disposer de l'autorisation "Issue and manage" Certificates sur l'autorité de certification.

Si une demande de certificat est maintenant soumise, la demande de certificat est placée en statut d'attente. Le demandeur reçoit un Request-ID que nous pouvons utiliser pour identifier la demande de certificat.

Avant que le certificat ne soit délivré, l'ensemble de données peut être modifié par un gestionnaire de certificats. Pour cela, le ICertAdmin interface de l'autorité de certification. Nous lui indiquons d'ajouter à l'enregistrement une extension de certificat de type Subject Alternative Name, que nous devons cependant construire nous-mêmes.

L'expert en PKI Vadims Podans a déjà fait des recherches sur ce sujet. excellentes recherches est exploité. Nous utilisons son exemple de code comme base pour un script qui simplifie notre projet.

[cmdletbinding()]
param(
    [Parameter(Mandatory = $true)]
    [string]
    $ConfigString,
    
    [Parameter(Mandatory = $true)]
    [int]
    $RequestID,

    [Parameter(Mandatory = $true)]
    [string[]]
    $DnsNames
)

$XCN_OID_SUBJECT_ALT_NAME2 =  "2.5.29.17"
$XCN_CERT_ALT_NAME_DNS_NAME = 0x3
$PROPTYPE_BINARY = 3
$XCN_CRYPT_STRING_BASE64 = 1

function ConvertTo-DERstring ([byte[]]$bytes) {

    if ($bytes.Length % 2 -eq 1) {$bytes += 0}

    $StringBuilder = New-Object System.Text.StringBuilder
 
    for ($n = 0; $n -lt $bytes.count; $n += 2) {
        [void]$StringBuilder.Append(
            [char]([int]$bytes[$n+1] -shl 8 -bor $bytes[$n])
        )
    }

    $StringBuilder.ToString()
}    

$SanExtension = New-Object -ComObject X509Enrollment.CX509ExtensionAlternativeNames
$SanCollection = New-Object -ComObject X509Enrollment.CAlternativeNames

foreach ($DnsName in $DnsNames) {
    $SanEntry = New-Object -ComObject X509Enrollment.CAlternativeName
    $SanEntry.InitializeFromString($XCN_CERT_ALT_NAME_DNS_NAME, $DnsName)
    $SanCollection.Add($SanEntry)
}

$SanExtension.InitializeEncode($SanCollection)

$CertAdmin = New-Object -ComObject CertificateAuthority.Admin
$CertAdmin.SetCertificateExtension(
    $ConfigString, 
    $RequestID, 
    $XCN_OID_SUBJECT_ALT_NAME2, 
    $PROPTYPE_BINARY, 
    0x0, 
    $(ConvertTo-DERstring (
        [Convert]::FromBase64String(
            $SanExtension.RawData($XCN_CRYPT_STRING_BASE64)
            )
        )
    )
)

Le script peut être appelé comme suit :

.\Set-SANExtension.ps1 -ConfigString "{CA-DNS-Name}\{CA-Common-Name}" -RequestID {Request-ID} -DnsNames {DNS-Name-List}

Un exemple :

.\Set-SANExtension.ps1 `
-ConfigString "CA02.intra.adcslabor.de\ADCS Labor Issuing CA 1" `
-RequestID 530859 `
-DnsNames "ein-dns-name.adcslabor.de","noch-ein-dns-name.adcslabor.de"

Si nous inspectons maintenant la demande de certificat via la console de gestion de l'autorité de certification, nous trouvons une extension de certificat du type "Subject Alternative Name", qui est indiquée comme ayant été ajoutée par un administrateur et qui contient les entrées souhaitées. Le certificat émis contiendra donc également les noms alternatifs.

Utiliser le module TameMyCerts Policy pour Microsoft Active Directory Certificate Services pour influencer l'extension des certificats SAN

Transfert automatique du nom commun dans l'extension SAN

TameMyCerts peut automatiquement transférer les noms DNS ou les adresses IP reconnus dans le Subject Distinguished Name d'une demande de certificat vers l'extension de certificat SAN des certificats émis. La configuration de cette fonction est décrite dans dans le manuel d'administration peut être consulté.

Transfert automatique des noms des principaux services dans l'extension SAN

TameMyCerts peut transférer automatiquement les noms principaux de service (SPN) trouvés dans les objets Active Directory associés vers l'extension de certificat SAN des certificats émis. La configuration de cette fonction est décrite dans dans le manuel d'administration peut être consulté.

Transfert automatique des champs de certificat dans l'extension SAN

TameMyCerts peut transférer automatiquement les champs présents dans la demande de certificat dans l'extension de certificat SAN des certificats émis, selon des règles définissables. La configuration de cette fonction est décrite dans dans le manuel d'administration peut être consulté.

Saisie automatique des attributs Active Directory dans l'extension SAN

TameMyCerts peut automatiquement transférer les attributs des objets Active Directory associés dans l'extension de certificat SAN des certificats émis selon des règles définissables. La manière dont cela est configuré peut être dans le manuel d'administration peut être consulté.

Liens complémentaires :

Sources externes

fr_FRFrançais