Seit der jüngst veröffentlichten Version 1.7 unterstützt das TameMyCerts Policy Modul für die Microsoft Active Directory Certificate Services die Personal Identity Verification (PIV) Attestierung für YubiKeys.
Ein YubiKey ist ein kompaktes Sicherheitstoken, welches unter Anderem wie eine Smartcard für die sichere Speicherung und Verwendung von Zertifikaten eingesetzt werden kann und somit auch für eine passwortlose Anmeldung an Active Directory Umgebungen verwendet werden kann.
Diese coole Funktion wurde von Oscar Virot entwickelt und in TameMyCerts integriert. Mit ihr ist es möglich, bei der Zertifikatausstellung kryptographisch nachzuweisen und somit sicherzustellen, dass ein Schlüsselpaar tatsächlich mit einem YubiKey erzeugt durch diesen gesichert ist und nicht exportiert werden kann.
Dies kann insbesondere bei der Erfüllung der NIS2-Richtlinie hilfreich werden, sofern sich Unternehmen für Zertifikate als zweiten Faktor für die Anmeldung mit sicherheitskritischen Konten im Active Directory entscheiden.
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.
Einrichtung
Zertifikatspeicher konfigurieren
Bei der PIV-Attestierung wird dem erzeugten Zertifikatantrag ein sogenanntes Attestierungszertifikat beigefügt. Dieses ist wiederum von einem Signaturzertifikat auf dem YubiKey signiert, welches wiederum von einer Zertifizierungsstelle des Herstellers Yubico signiert ist.
Wir müssen also zunächst unser Policy-Modul anweisen, diesen Zertifikaten der Firma Yubico für den Zweck der PIV-Attestierung zu vertrauen.
TameMyCerts nutzt – ganz analog zur in ADCS enthaltenen Trusted Platform Module (TPM) Key Attestation – den Windows-Zertifikatspeicher, um die Zertifikatkette für die YubiKey PIV Attestation zu bilden.
Nach dem Import der Zertifizierungsstellen-Zertifikate muss der Zertifizierungsstellen-Dienst neu gestartet werden, damit TameMyCerts die Zertifikate einliest.
Im "Local Machine" Zertifikatspeicher auf der Zertifizierungsstelle erzeugen wir mit einem PowerShell-Befehl zwei neuen Unterordner:
- Der Ordner "YKROOT" wird die Zertifikate der Stammzertifizierungsstellen (engl. "Root CA") für die PIV-Attestierung enthalten.
- Der Ordner "YKCA" wird die die Zertifikate Zwischenzertifizierungsstellen (engl. "Intermediate CA") für die PIV-Attestierung enthalten.
Set-Location -Path Cert:\LocalMachine
New-Item -Name YKROOT
New-Item -Name YKCA
Anschließend können die von Yubico zur Verfügung gestellten Stammzertifizierungsstellen-Zertifikate in in die neu erzeugten Zertifikatspeicher importiert werden – beispielsweise über die Managementkonsole für den lokalen Computer-Zertifikatspeicher (certlm.msc) oder via Script.
Die Stammzertifizierungsstelle kann unter diesem von diesem Link von Yubico bezogen werden.
Import über die Microsoft Management Console (certlm.msc)
Mit Rechtsklick auf den jeweiligen Ordner wird "All Tasks" – "Import…" ausgewählt.

Im folgenden Dialog wählt man eine entsprechende Datei aus.

Anschließend wählt man den gewünschten Speicherort.

Import via Script
Viel Arbeit kann man sich sparen, wenn man PowerShell und Kommandozeile kombiniert und die Zertifikate mit den folgenden Befehlen importiert.
Für die Stammzertifizierungsstellen-Zertifikate (Beispiel):
cd YubiKey-Root-CA-Certificates\
Get-ChildItem -Path *.cer | ForEach-Object -Process { certutil -addstore YKROOT $_.FullName }

Für die Zwischenzertifizierungsstellen-Zertifikate (Beispiel):
cd YubiKey-Intermediate-CA-Certificates\
Get-ChildItem -Path *.cer | ForEach-Object -Process { certutil -addstore YKCA $_.FullName }

Anschließend starten wir den Zertifizierungsstellen-Dienst neu, um die Zertifikate für TameMyCerts nutzbar zu machen.
Restart-Service -Name certsvc
Zertifikatvorlage konfigurieren
Wie für alle anderen Zertifikat-Typen auch müssen wir natürlich für unsere YubiKey-Zertifikate eine Zertifikatvorlage auf der Zertifizierungsstelle erstellen, konfigurieren und veröffentlichen.
Da dieser Prozess generisch ist wird er hier nicht näher erläutert.
Richtlinie für TameMyCerts konfigurieren
TameMyCerts ist Open Source und kann kostenfrei verwendet werden. Für den Einsatz im Unternehmensbereich empfiehlt sich jedoch der Abschluss eines Wartungsvertrags. Dies stellt sicher, dass Sie qualifizierte Unterstützung erhalten und dass das Modul langfristig in hoher Qualität weiterentwickelt werden kann.
Nachdem der Vertrauensstatus konfiguriert und eine Zertifikatvorlage erzeugt wurden, können wir nun wie bekannt eine Richtline für TameMyCerts erstellen.
In der TameMyCerts-Dokumentation ist näher beschrieben, welche Möglichkeiten es gibt.
In ihrer einfachsten Form könnte eine Konfigurationsdatei wie folgt aussehen:
<CertificateRequestPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<YubiKeyPolicies>
<YubiKeyPolicy />
</YubiKeyPolicies>
</CertificateRequestPolicy>
Diese Konfigurationsdatei würde lediglich sicherstellen, dass der Zertifikatantrag und das dazugehörige Schlüsselpaar mit einem YubiKey erzeugt wurden.
Folgende Konfigurationsdatei ist da schon umfangreicher:
<CertificateRequestPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Subject>
<SubjectRule>
<Field>commonName</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^.*$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
</Subject>
<YubiKeyPolicies>
<YubiKeyPolicy>
<Action>Allow</Action>
<PinPolicy>
<string>Once</string>
<string>Never</string>
<string>Always</string>
<string>MatchOnce</string>
<string>MatchAlways</string>
</PinPolicy>
<TouchPolicy>
<string>Always</string>
<string>Never</string>
<string>Cached</string>
</TouchPolicy>
<FormFactor>
<string>UsbAKeychain</string>
<string>UsbCKeychain</string>
<string>UsbANano</string>
<string>UsbCNano</string>
<string>UsbCLightning</string>
<string>UsbABiometricKeychain</string>
<string>UsbCBiometricKeychain</string>
</FormFactor>
<MaximumFirmwareVersion>9.9.9</MaximumFirmwareVersion>
<MinimumFirmwareVersion>5.1.3</MinimumFirmwareVersion>
<Edition>
<string>FIPS</string>
<string>Normal</string>
<string>CSPN</string>
</Edition>
<Slot>
<string>9a</string>
<string>9c</string>
<string>9d</string>
<string>9e</string>
</Slot>
<KeyAlgorithm>
<string>RSA</string>
<string>ECC</string>
</KeyAlgorithm>
</YubiKeyPolicy>
</YubiKeyPolicies>
</CertificateRequestPolicy>
Sie ist dafür konfiguriert, genau einen Subject Relative Distinguished Name (RDN) vom Typ commonName mit beliebigem Wert zuzulassen und YubiKey PIV-Attestierung mit folgenden Einschränkungen vorzunehmen:
- Alle PIN-Policies sind erlaubt.
- Alle Touch Policies sind erlaubt.
- Alle Formfaktoren sind erlaubt.
- Die Firmware muss mindestens Version 5.1.3 entsprechen.
- Alle Editionen sind erlaubt.
- Alle Slots sind erlaubt.
- Alle Schlüsselalgorithmen sind erlaubt.
Zertifikatanforderung erzeugen
Prinzipbedingt müssen die Zertifikatanträge mit Werkzeugen für Yubikeys erzeugt werden, damit die Attestierungsinformation teil dieser ist. Hierfür gibt es verschiedene Wege:
- yubico-piv-tool ist ein Kommandozeilenwerkzeug, das von der Firma Yubico genau für diesen Zweck bereitgestellt wird.
- Das YubiKey Software Development Toolkit wird von Yubico bereitgestellt, sodass diese Funktionen in eigene Anwendungen integriert werden können.
- Eine solche Anwendung ist die Yubikey-Verwaltungslösung SYNRION x.ID der Firma KeyOne.
- powershellYK und onboardYK sind ein quelloffenes Projekte von Oscar Virot, der die PIV-Attestierung zu TameMyCerts beigesteuert hat.
Ein Beispiel für die Erzeugung eines Zertifikatantrags mit dem yubico-piv-tool könnte wie folgt aussehen.
Zuerst wird das Schlüsselpaar erzeugt. Hierbei werden PIN- und Touch-Policies sowie der Schlüsselalgorithmus festgelegt. Der öffentliche Schlüssel wird in die Datei "pubkey.key" geschrieben.
yubico-piv-tool --slot=9a --action=generate --pin-policy=once --touch-policy=cached --algorithm=ECCP384 --output=pubkey.key
Als nächstes wird der attestierte Zertifikatantrag unter Verwendung des zuvor erstellten Schlüsselpaars erstellt und in die Datei "request.req" geschrieben.
yubico-piv-tool --slot=9a --subject="/CN=test/" --input=pubkey.key --attestation --output=request.req --action=verify-pin --action=request
Funktionstest
Wir verwenden für unseren Funktionstest die zuvor beschriebene Richtline mit drei unterschiedlichen Zertifikatanträgen:
- Der erste Zertifikatantrag wurde in Software erzeugt und enthält keine Attestierungsinformationen.
- Der zweite Zertifikatantrag wurde mit yubikey-piv-tool auf einem YubiKey mit Firmware 5.1.2 erzeugt (diese ist zu niedrig für unsere Richtlinie).
- Der dritte Zertifikatantrag wurde mit yubikey-piv-tool auf einem YubiKey mit Firmware 5.4.3 erzeugt.
Somit sollte nur der dritte Zertifikatantrag zu einer Zertifikatausstellung führen.
Erster Versuch: keine PIV-Attestierung
Wir senden den vorbereiteten Zertifikatantrag an die Zertifizierungsstelle:
certreq -attrib "CertificateTemplate:Yubikey_User_P384" -submit csr-no-attestation.req
Erwartungsgemäß wird dieser abgelehnt. Der zurückgegebene Fehlercode lautet "CERTSRV_E_TEMPLATE_DENIED".

Ein Blick in die Ereignisanzeige der Zertifizierungsstelle offenbart uns, dass der Zertifikatantrag abgelehnt wurde, weil er keine verwendbaren PIV-Attestierungsdaten enthält.

Zweiter Versuch: PIV-Attestierung ist vorhanden, aber die Firmware ist zu alt
Wir senden den vorbereiteten Zertifikatantrag an die Zertifizierungsstelle:
certreq -attrib "CertificateTemplate:Yubikey_User_P384" -submit 512-never-never-p384.req
Erwartungsgemäß wird auch dieser abgelehnt. Der zurückgegebene Fehlercode lautet wieder "CERTSRV_E_TEMPLATE_DENIED".

Ein Blick in die Ereignisanzeige der Zertifizierungsstelle offenbart uns, dass der Zertifikatantrag abgelehnt wurde, weil keine Yubikey-Richtlinie auf die in diesem Zertifikatantrag enthaltenen Attestierungsdaten zutrifft.
Die genaue Funktionsweise des YubiKey-Regelwerks ist in der Dokumentation für das TameMyCerts Policy Modul beschrieben.

Dritter Versuch: PIV-Attestierung ist vorhanden und konform zur Richtlinie
Wir senden den vorbereiteten Zertifikatantrag an die Zertifizierungsstelle:
certreq -attrib "CertificateTemplate:Yubikey_User_P384" -submit 543-never-never-p384.req
Nun bekommen wir ein Zertifikat ausgestellt.
TameMyCerts wird die in den PIV-Attestierungsinformationen enthaltenen Daten in das ausgestellte Zertifkat übernehmen. Diese sind:
- Firmware-Version des Yubikey
- Seriennummer des Yubikey
- PIN-Richtlinie
- Formfaktor
Siehe die Dokumentation von TameMyCerts für nähere Informationen hierzu.

Optional: PIV Attestierung im ausgestellten Zertifikat bestätigen
YubiKeys sind auf eine Größe für ausgestellte Zertifikat von 3052 Byte beschränkt, daher kann die originale Attestierungs-Information (das gesamte Attestierungszertifikat als Zertifikaterweiterung) nicht komplett in das ausgestellte Zertifikat übernommen werden, da es nicht auf den YubiKey importiert werden könnte.
TameMyCerts wird wie bereits zuvor beschrieben die Attestierungsinformationen, die im Attestierungszertifikat enthalten sind (als Zertifikaterweiterung im Attestierungs-Zertifikat) aus diesem extrahieren und in das ausgestellte Zertifikat übertragen.
Zusätzlich kann mit den Bordmitteln der Microsoft Zertifizierungsstelle auch noch eine Ausstellungsrichtline (engl. Issuance Policy) in das ausgestellte Zertifikat übertragen werden.
Die Verwendung von Ausstellungsrichtlinien erfordert, dass diese im Zertiftzierungsstellen-Zertifikat entweder ebenfalls enthalten sind, oder die "All Issuance Policies" Ausstellungsrichtline enthalten ist.
Dies wird in der Zertifikatvorlage konfiguriert. Hier wählt man die Karteikarte "Extensions" und editiert den Abschnitt "Issuance Policies".

Im folgenden Dialog kann man mit Klick auf "Add…" eine neue Richtline anlegen. Diese besteht aus einem Beschreibungstext, optional einer URL, unter welche die dazugehörige schriftliche Zertifkatrichtlinie aufgefunden werden kann, sowie einem eindeutigen, unternehmensspezifischen Objektidentifizierer.


Ausgestellte Zertifikate, für welche somit eine erfolgreiche PIV-Attestierung durch TameMyCerts erfolgte, werden dann eine entsprechende Ausstellungsrichtline in einer standardisierten Zertifikaterweiterung enthalten.

Weiterführende Links:
- Ein Policy Modul, um sie zu bändigen: Vorstellung des TameMyCerts Policy Moduls für Microsoft Active Directory Certificate Services
- Konfigurieren der Trusted Platform Module (TPM) Key Attestation
- Die Ausstellungsrichtlinien (Issuance Policies) für Trusted Platform (TPM) Key Attestation in ein Zertifizierungsstellen-Zertifikat aufnehmen
- Grundlagen: Konfigurationsdatei für die Zertifizierungsstelle (capolicy.inf)
Externe Quellen
- Integration and administration guide for the TameMyCerts policy module for Active Directory Certificate Services
- PIV attestation (Yubico)
- yubico-piv-tool (Yubico)
- SYNRION | Yubico
- Bring Your Own Token to Replace the Traditional Smartcards for Strong Authentication and Signing (Vortrag auf YouTube)
- virot/powershellYK (GitHub / Oscar Virot)
- virot/OnboardYK (GitHub / Oscar Virot)
- Passwordless RDP Authentication for On-Prem Servers with Smart Cards (FIDO2 Security Key) | Microsoft Community Hub