Grundlagen: Einschränkung der Pfadlänge (Path Length Constraint)

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

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:

Externe Quellen

de_DEDeutsch