Der Ende 2008 vorgeführte Angriff auf den MD5 Signaturalgorithmus konnte nur deshalb zur Erstellung eines nutzbaren gefälschten Zertifizierungsstellen-Zertifikats verwendet werden, da die angegriffene Zertifizierungsstelle keine Einschränkung der Pfadlänge konfiguriert hatte.
Die Einschränkung der Pfadlänge ist im RFC 5280 beschrieben. Die Idee dahinter ist, dass in der "Basic Constraints" Erweiterung eines Zertifizierungsstellen-Zertifikats die maximale Tiefe der Zertifizierungsstellen-Hierarchie hinterlegt wird.
Mit jeder Zertifizierungsstellen-Ebene wird die konfigurierte Zahl um 1 reduziert, bis sie 0 beträgt.
Die letzte Zertifizierungsstelle in der Kette enthält somit den Wert 0. Unterhalb dieser Zertifizierungsstelle sind keine weiteren Zertifizierungsstellen mehr erlaubt. Selbst wenn die Zertifizierungsstelle ein solches ausstellen würde, können Anwendungen diese Verletzung bei der Verifizierung der Zertifizierungsstellen-Hierarchie erkennen und die Verarbeitung eines solchen Zertifikates verweigern.
Konfigurieren der Enschränkung der Pfadlänge
Kennen Sie TameMyCerts? TameMyCerts ist ein Add-On für die Microsoft Zertifizierungsstelle (Active Directory Certificate Services). Es erweitert die Funktion der Zertifizierungsstelle und ermöglicht die Anwendung von Regelwerken, um die sichere Automatisierung von Zertifikat-Ausstellungen zu realisieren. TameMyCerts ist einzigartig im Microsoft-Ökosystem, hat sich bereits in unzähligen Unternehmen auf der ganzen Welt bewährt und steht unter einer freien Lizenz. Es kann über GitHub heruntergeladen und kostenlos verwendet werden. Professionelle Wartung wird ebenfalls angeboten.
Die Einschränkung der Pfadlänge wird bei Ausstellung der Zertifizierungsstellen-Zertifikats festgelegt. Sie kann auf verschiedenen Wegen umgesetzt werden:
- Sie kann durch die antragstellende Zertifizierungsstelle beantragt werden.
- Sie kann von einem Administrator an den Zertifikatantrag angehängt werden.
- Sie kann durch eine Richtlinie der übergeordneten Zertifizierungsstelle erzwungen werden.
- Sie wird grundsätzlich angewendet, wenn das Zertifikat der übergeordneten Zertifizierungsstelle über eine Einschränkung der Pfadlänge verfügt.
Beantragung durch die Zertifizierungsstelle
Soll die Zertifikatanforderung einer Zertifizierungsstelle eine Einschränkung der Pfadlänge beantragen, muss dies über die capolicy.inf angebildet werden:
[BasicConstraintsExtension] PathLength=0 Critical=TRUE
Zu beachten ist, dass die Erweiterung als kritisch markiert werden muss.
Conforming CAs MUST include this extension in all CA certificates that contain public keys used to validate digital signatures on certificates and MUST mark the extension as critical in such certificates.
https://tools.ietf.org/html/rfc5280#section-4.2.1.9
Vorgeben der Einschränkung der Pfadlänge durch die übergeordnete Zertifizierungsstelle
Es wird im Allgemeinem empfohlen, keine Einschränkung der Pfadlänge für Zertifikate von Stammzertifizierungsstellen zu setzen, da man sich so einem Großteil seiner Flexibilität beraubt. Eine Veränderung des Wertes erfordert die Ausstellung eines neuen zertifikates, was bei einer Stammzertifizierungstelle mit großem Aufwand für die erneute Verteilung des Vertrauensstatus verbunden ist
Diese Option bietet sich insbesondere für Stammzertifizierungsstellen an. Somit ist es nicht erforderlich, dass diese über eine hart ins Zertifizierungsstellen-Zertifikat eingetragene Einschränkung der Pfadlänge verfügt. Sie wird bei Ausstellung eines untergeordneten Zertifizierungsstellen-Zertifikats jedoch so tun, als ob dies der Fall wäre.
Dies kann mit folgendem Kommandozeilenbefehl (Kommandozeile als Administrator starten) erreicht werden:
certutil -setreg Policy\CAPathLength {Wert}
Möchte man die Zertifizierungsstellen-Hierarchie auf zwei Studen beschränken, trägt man einen Wert von 1 ein.
Der Zertifizierungsstellen-Dienst muss neu gestartet werden, damit die Änderung wirksam wird.
Demonstration: Verletzen des Path Length Constraint und erkennen der Verletzung
Im nachfolgenden Beispiel erzeugen wir eine Zertifikatkette, bei welcher eine ausstellende Zertifizierungsstelle über eine Einschränkung der Pfadlänge von 0 verfügt, also keine untergeordneten Zertifizierugsstellen-Zertifikat signieren kann. Wir verletzen diese Einschränkung, indem wir eine Ebene darunter eine weitere Zertifizierungstelle begründen, die mit dem privaten Schlüssel der eingeschränkten Zertifizierungsstelle signiert ist. Zu guter letzt stellen wir mit dieser unrechtmäßigen Zertifizierungsstelle dann ein End-Entitäts-Zertifikat aus und prüfen, ob die Richtlinienverletzung erkannt wird.
Für die Demonstration kann das PSCertificateEnrollment PowerShell Modul verwendet werden. Es kann über die PowerShell Gallery bezogen und anschließend geladen werden.
Install-Module -Name PSCertificateEnrollment
Import-Module -Name PSCertificateEnrollment
Folgender Befehl erzeugt ein Zertifikat für eine Stammzertifizierungsstelle und speichert das resultierende Zertifikat in der Variable $a.
$a = New-CertificateRequest -CA -Subject "CN=Root CA" -SelfSign
Anschließend wird mit folgendem Befehl eine untergeordnete Zertifizierungsstelle erzeugt, welche eine Einschränkung der Pfadlänge von 0 aufweist, d.h. es sind keine weiteren Zertifizierungsstellen unter ihr erlaubt. Signiert wird das Zertifikat mit dem in der Variable $a gespeicherten Stammzertifizierungsstellen-Zertifikat. Das resultierende Zertifikat wird in der Variable $b gespeichert.
$b = New-CertificateRequest -CA -Subject "CN=Sub CA" -SigningCert $a -PathLength 0
Nun simulieren wir, dass die in $b gespeicherte untergeordnete Zertifizierungsstelle kompromittiert wurde und es einem Angreifer gelungen ist, ein Zertifizierungsstellen-Zertifikat mit ihr zu signieren.
In der Variable $c wird also das Zertifikat der unerlaubten und mit $b signierten Zertifizierungsstelle gespeichert.
$c = New-CertificateRequest -CA -Subject "CN=Invalid Path Length CA" -SigningCert $b
Mit dieser Zertifizierungsstelle stellen wir nun ein Endentitäts-Zertifikat aus und speichern es in der Variable $d.
$d = New-CertificateRequest -Eku "ServerAuthentication" -Subject "CN=Invalid Path Length Certificate" -Dns "www.demo.org" -SigningCert $c
Die vier Variablen beinhalten nun die erzeugte Zertifikatkette.
$a,$b,$c,$d
Das Stammzertifizierungsstellen-Zertifikat muss für den Test vorübergehend in den Zertifikatspeicher für vertrauenswürdige Stammzertifizierungsstellen aufgenommen werden. Nach dem Test sollte es jedoch wieder entfernt werden, um kein Sicherheitsrisiko zu hinterlassen.
Öffnet man nun das Endentitätszertifikat, wird man feststellen, dass eine Warnung angezeigt wird, um darauf hinzuweisen, dass das Zertifikat nicht als gültig anerkannt wird:
This certificate is not valid because one of the certification authorities in the certification path does not appear to be allowed to issue certificates or this certificate cannot be used as an end-entity certificate.
In der Karteikarte "Certification Path" sieht man auch, welcher Teil der Zertifikatkette eine Verletzung der Richtlinien ausgelöst hat. Es ist die "Sub CA" – die eigentlich legitime Zertifizierungsstelle. Sie wird als Schuldiger identifiziert, da sie diejenige ist, die aus sich der Prüflogik fälschlicherweise ein unerlaubtes Zertifikat ausgestellt hat.
Weiterführende Links:
- Die Beantragung eines Zertifizierungsstellen-Zertifikats schlägt fehl mit Fehlermeldung "The certification authority’s certificate contains invalid data. 0x80094005 (-2146877435 CERTSRV_E_INVALID_CA_CERTIFICATE)"
- Verwenden von Name Constraints, um einer Zertifizierungsstelle nur die Ausstellung von Zertifikaten für bestimmte Domänennamen zu erlauben
Externe Quellen
- MD5 considered harmful today (Technische Universiteit Eindhoven)
- RFC 5280 – Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile (Internet Engineering Task Force)
4 Gedanken zu „Grundlagen: Einschränkung der Pfadlänge (Path Length Constraint)“
Kommentare sind geschlossen.