Post

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.req zur 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.cer zurü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.