How-to: AD CS Offline Root + Issuing CA sauber aufsetzen (kleines, praxistaugliches Setup)
How-to: AD CS Offline Root + Issuing CA sauber aufsetzen (kleines, praxistaugliches Setup)
Eine sauber aufgebaute PKI-Infrastruktur mit Offline Root CA und Issuing CA ist kein Hexenwerk — wenn man von Anfang an die richtigen Grundlagen legt. Dieses How-to führt Schritt für Schritt durch ein minimales, aber praxistaugliches Setup mit AD CS.
Architektur (Minimal, aber „richtig“)
- Offline Root CA (Workgroup, kein Domain Join, Maschine ausgeschaltet/isoliert)
- Issuing CA (Domain-joined, online, stellt Zertifikate aus)
- Optional: OCSP Responder (später)
Warum das wichtig ist:
- Root-Schlüssel bleibt offline → deutlich weniger Risiko.
- Issuing CA kann restriktiv gehärtet und bei Bedarf ersetzt werden.
Vorbereitungen
Namens- und URL-Plan festlegen
Du brauchst stabile URLs für:
- AIA (CA-Zertifikate)
- CDP (CRL Distribution Point)
Beispiel:
- AIA:
http://pki.example.com/aia/ - CDP:
http://pki.example.com/crl/
Verzeichnisstruktur am Webserver
1
2
sudo mkdir -p /var/www/html/pki/{aia,crl}
sudo chown -R www-data:www-data /var/www/html/pki
(Windows IIS geht natürlich ebenso; wichtig ist die Stabilität der URL.)
Schritt-für-Schritt: Offline Root CA
1) CAPolicy.inf erstellen (Root)
Lege auf der Offline-Root in C:\Windows\CAPolicy.inf z. B. an:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Version]
Signature="$Windows NT$"
[PolicyStatementExtension]
Policies=InternalPolicy
[InternalPolicy]
OID=1.2.3.4.1455.67.89.5
Notice="Internal PKI Policy"
URL="http://pki.example.com/policy/pki-cps.html"
[Certsrv_Server]
RenewalKeyLength=4096
RenewalValidityPeriod=Years
RenewalValidityPeriodUnits=20
CRLPeriod=Weeks
CRLPeriodUnits=26
CRLDeltaPeriod=Days
CRLDeltaPeriodUnits=0
LoadDefaultTemplates=0
2) AD CS Rolle installieren und Root CA konfigurieren
Auf der Offline-Root:
1
2
3
4
5
6
Install-WindowsFeature ADCS-Cert-Authority -IncludeManagementTools
Install-AdcsCertificationAuthority `
-CAType StandaloneRootCA `
-CACommonName "EXAMPLE Root CA" `
-KeyLength 4096 `
-HashAlgorithmName SHA256
3) AIA/CDP konfigurieren (Root) und CRL publizieren
Wichtig: Die Root muss ihre CRL veröffentlichen, bevor Clients irgendwas validieren können.
1
2
3
4
certutil -setreg CA\CRLPublicationURLs "1:C:\Windows\System32\CertSrv\CertEnroll\%3%8%9.crl\n2:http://pki.example.com/crl/%3%8%9.crl"
certutil -setreg CA\CACertPublicationURLs "1:C:\Windows\System32\CertSrv\CertEnroll\%1_%3%4.crt\n2:http://pki.example.com/aia/%1_%3%4.crt"
net stop certsvc && net start certsvc
certutil -crl
Kopiere anschließend *.crl und *.crt aus CertEnroll auf deinen Webserver (AIA/CDP).
Schritt-für-Schritt: Issuing CA
1) CAPolicy.inf (Issuing)
Auf der Issuing CA:
1
2
3
4
5
6
7
8
[Version]
Signature="$Windows NT$"
[Certsrv_Server]
RenewalKeyLength=4096
RenewalValidityPeriod=Years
RenewalValidityPeriodUnits=10
LoadDefaultTemplates=0
2) Rolle installieren, aber noch nicht fertig konfigurieren
1
Install-WindowsFeature ADCS-Cert-Authority -IncludeManagementTools
3) Issuing CA als Subordinate installieren (CSR erzeugen)
1
2
3
4
5
6
Install-AdcsCertificationAuthority `
-CAType EnterpriseSubordinateCA `
-CACommonName "EXAMPLE Issuing CA 01" `
-KeyLength 4096 `
-HashAlgorithmName SHA256 `
-OutputCertRequestFile "C:\temp\issuing-ca.req"
4) CSR auf der Offline Root signieren
- Transfer
issuing-ca.reqzur Offline-Root (USB/isolierter Transfer) - Signieren:
1
certreq -submit -attrib "CertificateTemplate:SubCA" C:\temp\issuing-ca.req C:\temp\issuing-ca.cer
- Transfer
issuing-ca.cerzurück zur Issuing CA
5) Issuing CA fertigstellen und AIA/CDP setzen
1
2
3
4
5
certutil -installcert C:\temp\issuing-ca.cer
certutil -setreg CA\CRLPublicationURLs "1:C:\Windows\System32\CertSrv\CertEnroll\%3%8%9.crl\n2:http://pki.example.com/crl/%3%8%9.crl"
certutil -setreg CA\CACertPublicationURLs "1:C:\Windows\System32\CertSrv\CertEnroll\%1_%3%4.crt\n2:http://pki.example.com/aia/%1_%3%4.crt"
net stop certsvc && net start certsvc
certutil -crl
Kopiere auch hier die neuen Dateien nach AIA/CDP.
Validierung (Client-Sicht)
Auf einem Domain-Client:
1
2
3
4
5
6
# Prüfe ob AIA/CDP erreichbar sind
Invoke-WebRequest http://pki.example.com/aia/EXAMPLE%20Issuing%20CA%2001_EXAMPLE%20Root%20CA.crt -UseBasicParsing
Invoke-WebRequest http://pki.example.com/crl/EXAMPLE%20Root%20CA.crl -UseBasicParsing
# Chain-Build testen
certutil -verify -urlfetch C:\path\to\somecert.cer
Betriebs-Checkliste
- CRL Publish Job (Root manuell nach Plan; Issuing regelmäßig)
- Gültigkeitsdauern dokumentiert (Root/Issuing)
- Private Keys geschützt (HSM/TPM/BitLocker)
- Backup/Restore getestet (System State + CA DB)
- Auditing aktiviert und Log Forwarding eingerichtet
Takeaways
- Plane AIA/CDP/CRL-URLs zuerst – nachträgliches Ändern ist schmerzhaft.
- Offline Root bedeutet: CRL-Publishing ist ein Prozess, kein einmaliger Akt.
- „LoadDefaultTemplates=0“ zwingt dich zu bewusstem Template-Management.
- Teste Chain-Build und URL-Fetch früh mit
certutil -verify -urlfetch. - Dokumentation + Wiederholbarkeit (Runbook) ist bei PKI wichtiger als „perfekte“ Theorie.
This post is licensed under CC BY 4.0 by the author.
