Die Intermediate Certification Authority (Intermediate-CA) bildet die operative Zertifizierungsstelle der internen Public Key Infrastructure (PKI). Sie dient der Ausstellung und Verwaltung von Server-, Client- und weiteren Endzertifikaten und wird durch die übergeordnete Offline Root-CA signiert. Im Gegensatz zur Root-CA übernimmt die Intermediate-CA den täglichen Zertifikatsbetrieb sowie die Erstellung von Certificate Revocation Lists (CRLs).
Durch die Trennung zwischen Offline Root-CA und operativer Intermediate-CA wird die sicherheitskritische Vertrauensbasis der PKI von den regulären Zertifikatsprozessen isoliert. Kompromittierungen oder Fehlkonfigurationen auf Ebene der Intermediate-CA betreffen ausschließlich die von ihr ausgestellten Zertifikate und können durch Widerruf sowie Neuausstellung der betroffenen Intermediate-CA kontrolliert eingegrenzt werden, ohne die gesamte PKI neu aufbauen zu müssen.
Ziel dieser Dokumentation ist die Beschreibung der Architektur, des Betriebsmodells sowie der technischen und sicherheitsrelevanten Anforderungen für Aufbau, Verwaltung und Absicherung einer operativen Intermediate-CA innerhalb der internen PKI-Infrastruktur.
Installation
Installation benötigter Pakete
$ sudo apt install openssl opensc pcscd rng-tools -y
Verwendete Komponenten:
Siehe Artikel: Root-CA (OpenSSL)
Erstellung eines dedizierten PKI-Benutzers
Siehe Artikel: Root-CA (OpenSSL)
Erstellung der Intermediate-CA-Verzeichnisstruktur
Verzeichnisstruktur anlegen:
$ mkdir -p ~/intermediate-ca/{certs,crl,csr,newcerts,private,issued,chain}
Schutz des Schlüsselverzeichnisses:
$ chmod 700 ~/intermediate-ca/private
Initialisierung der OpenSSL-CA-Datenbank:
$ touch ~/intermediate-ca/index.txt
$ echo 1000 > ~/intermediate-ca/serial
$ echo 1000 > ~/intermediate-ca/crlnumber
Zweck der Verzeichnisstruktur
~/intermediate-ca/certs: Speichert ausgestellte Zertifikate.~/Speichert Certificate Revocation Lists (CRLs).intermediate-ca/crl:~/Von OpenSSL verwaltetes Archiv ausgestellter Zertifikate.intermediate-ca/newcerts:~/Speicherort privater Schlüssel. Dieses Verzeichnis besitzt restriktive Zugriffsrechte.intermediate-ca/private:~/Speicherort für Certificate Signing Requests.intermediate-ca/csr:~/Vorbereitendes Verzeichnis für später ausgestellte Endzertifikate.intermediate-ca/issued:~/Speichert Zertifikatsketten und CA-Chain-Dateien.intermediate-ca/chain:
OpenSSL-CA-Datenbank
~/OpenSSL führt eine einfache Zertifikatsdatenbank zur Verwaltung ausgestellter Zertifikate. Die Datei enthält:intermediate-ca/index.txt:- Seriennummern
- Statusinformationen
- Widerrufe
- Ablaufdaten
~/Definiert die nächste zu verwendende Zertifikatsseriennummer.intermediate-ca/serial:~/Definiert die nächste Versionsnummer für CRLs.intermediate-ca/crlnumber:
Erstellung der OpenSSL-Konfiguration
Konfigurationsdatei erstellen:
$ vi ~/intermediate-ca/openssl.cnf
Inhalt der Konfigurationsdatei:
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/pki/intermediate-ca
default_crl_days = 30
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
crlnumber = $dir/crlnumber
private_key = $dir/private/intermediate-ca.key.pem
certificate = $dir/certs/intermediate-ca.cert.pem
default_md = sha512
policy = policy_loose
email_in_dn = no
name_opt = ca_default
cert_opt = ca_default
copy_extensions = copy
default_days = 825
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
string_mask = utf8only
default_md = sha512
req_extensions = v3_intermediate_ca_req
[ req_distinguished_name ]
countryName = Country Name
countryName_default = DE
organizationName = Organization Name
organizationName_default = Prontosystems
organizationalUnitName = Organizational Unit Name
organizationalUnitName_default = PKI
commonName = Common Name
commonName_default = Prontosystems Intermediate CA 01
[ v3_intermediate_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, cRLSign, keyCertSign
[ v3_intermediate_ca_req ]
subjectKeyIdentifier = hash
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, cRLSign, keyCertSign
[ server_cert ]
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[ client_cert ]
basicConstraints = CA:FALSE
nsCertType = client
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
Wichtige Eigenschaften der Konfiguration:
policy_loose: Die Intermediate-CA arbeitet flexibler als die Root-CA. Dadurch können später unterschiedliche Server- und Clientzertifikate ausgestellt werden.copy_extensions = copy: Diese Einstellung übernimmt Subject Alternative Names (SANs) aus späteren CSRs. Das ist für moderne TLS-Zertifikate zwingend erforderlich.pathlen:0: (basicConstraints = critical, CA:true, pathlen:0) Diese Einstellung erlaubt der Intermediate-CA die Ausstellung von Endzertifikaten und die Signierung von CRLs. Verbietet jedoch die Signierung weiterer Unter-CAs. Dadurch wird die PKI-Hierarchie sicher begrenzt.default_days = 825: Die maximale Laufzeit ausgestellter Endzertifikate wird auf 825 Tage begrenzt. Dies orientiert sich an modernen TLS-Empfehlungen.default_crl_days = 30: Die erzeugte CRL besitzt eine Gültigkeit von 30 Tagen und muss anschließend erneuert werden.
Erstellung des privaten Intermediate-Schlüssels
Schlüsselgenerierung:
$ openssl genrsa -aes256 \
-out ~/intermediate-ca/private/intermediate-ca.key.pem \
4096
Zugriffsrechte setzen:
$ chmod 400 ~/intermediate-ca/private/intermediate-ca.key.pem
Zweck:
Dieses Kommando erzeugt:
- einen RSA-4096-Privatschlüssel
- AES-256-verschlüsselt
Der Schlüssel bildet die kryptographische Identität der Intermediate-CA.
Erstellung des Intermediate-CA-CSRs
CSR erzeugen:
$ openssl req \
-config ~/intermediate-ca/openssl.cnf \
-new -sha512 \
-key ~/intermediate-ca/private/intermediate-ca.key.pem \
-out ~/intermediate-ca/csr/intermediate-ca.csr.pem
Zweck:
Die Intermediate-CA erzeugt keinen selbstsignierten Zertifikatsdatensatz.
Stattdessen wird:
- ein CSR erzeugt
- anschließend durch die Offline Root-CA signiert
Dadurch entsteht die eigentliche Zertifikatskette.
Signierung durch die Offline Root-CA
Der CSR wird zur Root-CA übertragen. Der private Schlüssel verbleibt ausschließlich auf der Intermediate-CA. Die Root-CA hat für Intermediates ein eigenes Signaturprofil [ v3_intermediate_ca ] in der OpenSSL-Konfigurationsdatei.
Signierung des Intermediate-Zertifikats (auf Root-CA)
$ openssl ca \
-config ~/root-ca/openssl.cnf \
-extensions v3_intermediate_ca \
-days 3650 \
-notext -md sha512 \
-in ~/root-ca/csr/intermediate-ca.csr.pem \
-out ~/root-ca/certs/intermediate-ca.cert.pem
Import des Intermediate-Zertifikats
Intermediate-Zertifikat in Datei übernehmen:
~/intermediate-ca/certs/intermediate-ca.cert.pem
Root-Zertifikat in Datei übernehmen:
~/intermediate-ca/chain/root-ca.cert.pem
Erstellung der Zertifikatskette
Chain-Datei erzeugen:
$ cat ~/intermediate-ca/certs/intermediate-ca.cert.pem \
~/intermediate-ca/chain/root-ca.cert.pem \
> ~/intermediate-ca/chain/ca-chain.cert.pem
Zweck:
Die Chain-Datei enthält in korrekter Reihenfolge:
- Intermediate-Zertifikat
- Root-Zertifikat
Diese Datei wird später für folgende Dienste verwendet:
- für TLS-Dienste
- Webserver
- VPNs
- Zertifikatsvalidierung
Verifikation der Zertifikatskette
Zertifikatsprüfung:
$ openssl verify \
-CAfile ~/intermediate-ca/chain/root-ca.cert.pem \
~/intermediate-ca/certs/intermediate-ca.cert.pem
Erwartete Ausgabe:
/home/pki/intermediate-ca/certs/intermediate-ca.cert.pem: OK
Zweck:
Die Prüfung bestätigt:
- korrekte Signatur
- funktionierende Vertrauenskette
- korrekte CA-Hierarchie
Erstellung der ersten Certificate Revocation List (CRL)
CRL erzeugen:
$ openssl ca \
-config ~/intermediate-ca/openssl.cnf \
-gencrl \
-out ~/intermediate-ca/crl/intermediate-ca.crl.pem
CRL analysieren:
$ openssl crl \
-in ~/intermediate-ca/crl/intermediate-ca.crl.pem \
-noout -text
Zweck:
Die CRL dient der späteren Veröffentlichung widerrufener Zertifikate.
Die Intermediate-CA ist damit:
- signierfähig
- widerruffähig
und bildet eine vollständige operative CA-Basis.
Sicherheitsbetrachtung
Die Intermediate-CA sollte:
- ausschließlich für operative Zertifikatsausstellung verwendet werden
- regelmäßig gesichert werden
- restriktiv administriert werden
- nicht für allgemeine Systemadministration verwendet werden
Die Offline Root-CA sollte nach erfolgreicher Signierung wieder offline genommen werden.
![]()