Den Subject Alternative Name (SAN) eines Zertifikats vor dessen Ausstellung verändern – aber sicher!

In Netz kursieren leider viel zu viele Anleitungen (auch die großen Player sind hiervon nicht ausgenommen, nicht einmal Microsoft selbst oder der Großmeister Komar), welche fatalerweise empfehlen, dass das Flag EDITF_ATTRIBUTESUBJECTALTNAME2 auf der Zertifizierungsstelle gesetzt werden sollte – angeblich damit man in der Lage wäre, für manuell gestellte Zertifikatanforderungen Zertifikate mit Subject Alternative Name (SAN) Erweiterung ausstellen zu können.

Leider ist diese Vorgehensweise nicht nur unnötig, sie hat auch einige unangenehme Nebenwirkungen, welche einem Angreifer im schlechtesten Fall dazu verhelfen können, die gesamte Active Directory Gesamtstruktur zu übernehmen.

Aus diesem Grund wird auch das TameMyCerts Policy Modul für Microsoft Active Directory Certificate Services, sofern das Flag aktiviert ist, solche Versuche erkennen, ablehnen und protokollieren:

Wie kann ich die SAN-Erweiterung auf sicherem Weg (nachträglich) einer Zertifikatanforderung hinzufügen?

Am besten ist es natürlich, wenn die alternativen Namen bereits Teil des ursprünglichen Zertifikatantrags (Certificate Signing Request, CSR) sind. Die Vorgehensweise für die Erstellung entsprechender Zertifikatanträge auf Windows ist ausführlich im Artikel "Manuelle Beantragung eines Webserver-Zertifikats" beschrieben.

Leider ist dieses Vorgehen aber nicht mit allen Systemen möglich, sodass es den Bedarf geben kann, SAN-Einträge nachträglich zu einem Zertifikatantrag hinzuzufügen.

Der Zertifikatantrag selbst kann leider nachträglich nicht mehr bearbeitet werden, da er mit dem privaten Schlüssel des Antragstellers signiert ist. Somit verbleibt nur die Möglichkeit, den Ausstellungsprozess der Zertifizierungsstelle zu beeinflussen, bevor diese das Zertifikat ausstellen wird.

Folgende "sichere" Möglichkeiten, alternative Namen nachträglich zu einem Zertifikatantrag hinzuzufügen und somit in das resultierende Zertifikat zu bringen, bieten sich daher an:

  • Man verpackt den originalen Zertifikatantrag in einer signierten CMC-Schicht, welche die alternativen Namen enthält.
  • Man stellt die dazugehörige Zertifikatvorlage auf Genehmigung durch einen Zertifikatmanager und setzt die alternativen Namen nach Einreichung des Zertifikatantrags über die administrativen Schnittstellen der Zertifizierungsstelle.
  • Man verwendet das TameMyCerts Policy Modul für Microsoft Active Directory Certificate Services.

Alle Vorgehensweisen haben gemeinsam, dass sie von einem Zertifikatmanager oder der Zertifizierungsstelle selbst vorgenommen werden, da hier eine Ausstellung zugrunde liegt, welche von ursprünglichen Zertifikatantrag abweicht.

Nachfolgend werden die einzelnen Methoden anhand des Beispiels eines Webserver-Zertifikats beschrieben, dessen Zertifikatantrag zusätzliche alternative Namen in Form von DNS-Namen erhalten soll.

Der Zertifikatantrag enthält nur einen Common Name, aber keine Subject Alternative Name (SAN) Zertifikaterweiterung.

Eine SAN-Zertifikaterweiterung nachträglich über eine CMC-Schicht hinzufügen

Diese Methode funktionier sowohl mit Zertifikatvorlagen, welche konfiguriert sind, das resultierende Zertifikat direkt auszustellen, als auch für solche, die die Genehmigung durch einen Zertifikatmanager benötigen.

Hierbei wird der ursprüngliche Zertifikatantrag in einer Certificate Management over CMS (CMC, RFC 5272) Nachricht verpackt. Die SAN-Erweiterung ist Teil der CMC-Schicht.

Durch die Signatur der CMC-Schicht mit dem Zertifikat eines Registrierungsagenten (oder dem der Zertifizierungsstelle) ist eine Authentisierung durch einen (vermeintlich) berechtigten Zertifikatmanager sichergestellt.

Für weitere Details siehe auch Artikel "Grundlagen: Enroll on Behalf of (EOBO)".

Zunächst muss eine Definitions-Datei mit folgendem Inhalt erzeugt werden.

[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&"

Nun kann die Definitions-Datei auf den Zertifikatantrag angewendet werden.

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

Der ursprüngliche Zertifikatantrag wird nun in eine CMC-Schicht verpackt, welche die zusätzlichen Informationen beinhaltet. Diese muss von einem Zertifikatmanager signiert werden.

Alternativ kann auch das Zertifizierungsstellen-Zertifikat verwendet werden. Der Prozess sollte jedoch nach Möglichkeit nicht direkt auf dem Zertifizierungsstellen-Server durchgeführt werden, sodass sich dies nicht für die produktive Verwendung eignet.

Wir können nun die resultierende Datei inspizieren.

certutil -dump {Dateiname-Signierte-Zertifikatanforderung}

Hier können wir erkennen, dass der ursprüngliche Zertifikatantrag Teil einer Verschachtelungsebene ist. Die alternativen Namen sind Teil der übergeordneten CMC-Schicht.

Nun kann die verpackte Zertifikatanforderung an die Zertifizierungsstelle gesendet werden.

certreq -submit {Dateiname-Signierte-Zertifikatanforderung}

Das TameMyCerts Policy Modul für Microsoft Active Directory Certificate Services setzt nach dem Windows Default Policy Modul ein und ist damit in der Lage, auch auf diesem Weg nachträglich hinzugefügte Inhalte zu erkennen, und Regel auf diese anzuwenden.

Das resultierende Zertifikat wird nun die gewünschten DNS-Namen enthalten.

Eine SAN-Zertifikaterweiterung nachträglich über die Administrations-Schnittstellen der Zertifizierungsstelle hinzufügen

Diese Methode funktioniert nur für Zertifikatvorlagen, welche die Genehmigung durch einen Zertifikatmanager benötigen, das resultierende Zertifikat also nicht direkt ausgestellt wird. Sie kann lokal oder remote gegen die Zertifizierungsstelle durchgeführt werden.

Der ausführende Benutzer benötigt die Berechtigung "Issue and manage" Certificates auf der Zertifizierungsstelle.

Wird nun eine Zertifikatanforderung eingereicht, wird der Zertifikatantrag in einen Wartestatus versetzt. Der Antragsteller bekommt eine Request-ID mitgeteilt, welche wir zur Identifikation des Zertifikatantrags verwenden können.

Bevor das Zertifikat ausgestellt wird, kann der Datensatz durch einen Zertifikatmanager verändert werden. Hierfür wird das ICertAdmin Interface der Zertifizierungsstelle angesprochen. Wir weisen es an, dem Datensatz eine im Zertifikaterweiterung vom Typ Subject Alternative Name hinzuzufügen, welche wir jedoch selbst konstruieren müssen.

PKI-Experte Vadims Podans hat hier bereits exzellente Recherchen betrieben. Wir verwenden sein Codebeispiel als Basis für ein Script, welches unser Vorhaben vereinfacht.

[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)
            )
        )
    )
)

Das Script kann wie folgt aufgerufen werden:

.\Set-SANExtension.ps1 -ConfigString "{DNS-Name-der-CA}\{Common-Name-der-CA}" -RequestID {Request-ID} -DnsNames {Liste-der-gewünschten-DNS-Namen}

Inspizieren wir nun die Zertifikatanforderung über die Zertifizierungsstellen-Managementkonsole, finden wir eine Zertifikaterweiterung vom Typ "Subject Alternative Name", welche als durch einen Administrator hinzugefügt ausgewiesen ist, und die gewünschten Einträge beinhaltet. Das ausgestellte Zertifikat wird somit die alternativen Namen ebenfalls enthalten.

Das TameMyCerts Policy Modul für Microsoft Active Directory Certificate Services verwenden, um die SAN-Zertifikaterweiterung zu beeinflussen

Automatisches übertragen des Common Name in die SAN-Erweiterung

TameMyCerts kann automatisch im Subject Distinguished Name eines Zertifikatantrags erkannte DNS-Namen oder IP-Adressen in die SAN-Zertifikaterweiterung ausgestellter Zertifikate überführen. Wie dies konfiguriert wird, kann im Administrationshandbuch nachgelesen werden.

Automatisches übertragen von Service Principal Names in die SAN-Erweiterung

TameMyCerts kann automatisch in zugehörigen Active Directory Objekten gefundene Dienstprinzipalnamen (engl. Service Principal Names, SPNs) in die SAN-Zertifikaterweiterung ausgestellter Zertifikate überführen. Wie dies konfiguriert wird, kann im Administrationshandbuch nachgelesen werden.

Automatisches übertragen von Zertifikatfeldern in die SAN-Erweiterung

TameMyCerts kann automatisch im Zertifikatantrag vorkommende Felder nach definierbaren Regeln in die SAN-Zertifikaterweiterung ausgestellter Zertifikate überführen. Wie dies konfiguriert wird, kann im Administrationshandbuch nachgelesen werden.

Automatisches eintragen von Active Directory Attributen in die SAN-Erweiterung

TameMyCerts kann automatisch Attribute von zugehörigen Active Directory Objekten nach definierbaren Regeln in die SAN-Zertifikaterweiterung ausgestellter Zertifikate überführen. Wie dies konfiguriert wird, kann im Administrationshandbuch nachgelesen werden.

Weiterführende Links:

Externe Quellen

de_DEDeutsch