Eine eigene Zertifikatskette aufbauen
Zertifikatsketten klingen komplizierter, als sie sind. Für unser Beispiel benötigen wir vier Zertifikate:
Root CA ↓ Intermediate CA ├── Producer └── Recipient
CA steht für Certificate Authority, auf Deutsch Zertifizierungsstelle. Eine CA stellt digitale Zertifikate aus und signiert sie mit ihrem Private Key.
Die Root CA signiert das Zertifikat der Intermediate CA. Die Intermediate CA stellt anschließend zwei unterschiedliche Endzertifikate aus:
- Das Producer-Zertifikat wird zum Signieren von Package Manifests und KAP Key Delivery Messages verwendet.
- Das Recipient-Zertifikat wird verwendet, um File Keys für einen bestimmten Empfänger zu verschlüsseln.
Jede Stelle besitzt einen eigenen Private Key und ein Zertifikat. Der Private Key bleibt geheim. Das Zertifikat darf weitergegeben werden.
In diesem How-to bauen wir diese Zertifikatsstruktur Schritt für Schritt selbst auf.
Voraussetzungen
Ob OpenSSL installiert ist, prüfen wir mit:
openssl version
Für das Beispiel verwenden wir RSA-Schlüssel mit einer Länge von 3072 Bit.
Root CA erzeugen
Wir beginnen mit der Root CA. Dafür benötigen wir einen Private Key und ein selbstsigniertes Zertifikat.
1. Private Key erzeugen
openssl genpkey \ -algorithm RSA \ -pkeyopt rsa_keygen_bits:3072 \ -out root-ca-key.pem
Damit entsteht:
root-ca-key.pem
Das ist der geheime Schlüssel unserer Root CA. Private Keys werden nicht weitergegeben.
2. Root-Zertifikat erzeugen
openssl req -x509 -new \ -key root-ca-key.pem \ -sha256 \ -days 3650 \ -out root-ca.pem \ -subj "/CN=KAPRI Example Root CA" \ -addext "basicConstraints=critical,CA:TRUE,pathlen:1" \ -addext "keyUsage=critical,keyCertSign,cRLSign"
Damit entsteht:
root-ca.pem
Da über der Root CA keine weitere CA steht, signiert sie ihr Zertifikat selbst. Man spricht deshalb von einem selbstsignierten Zertifikat.
Die Erweiterung
CA:TRUE
kennzeichnet das Zertifikat als CA-Zertifikat.
Die Angabe
pathlen:1
erlaubt genau eine weitere untergeordnete CA-Ebene. Das ist in unserem Beispiel die Intermediate CA.
Wir haben jetzt:
root-ca-key.pem Private Key root-ca.pem Zertifikat
3. Zertifikat ansehen
openssl x509 -in root-ca.pem -text -noout
Interessant sind zunächst zwei Angaben:
Issuer: CN = KAPRI Example Root CA Subject: CN = KAPRI Example Root CA
Subject bezeichnet den Inhaber des Zertifikats.
Issuer bezeichnet die Stelle, die das Zertifikat ausgestellt hat.
Bei einem selbstsignierten Root-Zertifikat sind beide identisch.
Unter Basic Constraints sollte außerdem stehen:
CA:TRUE, pathlen:1
4. Zertifikat prüfen
openssl verify \ -CAfile root-ca.pem \ root-ca.pem
Das Ergebnis sollte sein:
root-ca.pem: OK
Damit steht der erste Teil unserer Zertifikatsstruktur:
Root CA ↓ ?
Als Nächstes erzeugen wir die Intermediate CA und lassen ihr Zertifikat von der Root CA signieren.
Intermediate CA erzeugen
Jetzt ergänzen wir die zweite Ebene:
Root CA ↓ Intermediate CA
Die Intermediate CA erhält einen eigenen Private Key. Ihr Zertifikat wird anschließend von der Root CA signiert.
1. Private Key erzeugen
openssl genpkey \ -algorithm RSA \ -pkeyopt rsa_keygen_bits:3072 \ -out intermediate-ca-key.pem
Damit entsteht:
intermediate-ca-key.pem
Auch dieser Private Key bleibt geheim.
2. Certificate Signing Request erzeugen
Damit die Root CA ein Zertifikat für die Intermediate CA ausstellen kann, erzeugen wir einen Certificate Signing Request:
openssl req -new \ -key intermediate-ca-key.pem \ -out intermediate-ca.csr \ -subj "/CN=KAPRI Example Intermediate CA"
Der CSR enthält die Identität und den Public Key der Intermediate CA – nicht ihren Private Key.
Er ist vereinfacht gesagt die Anfrage:
Bitte stelle für diesen Public Key ein Zertifikat aus.
3. Zertifikat ausstellen
Jetzt signiert die Root CA das Zertifikat der Intermediate CA:
openssl x509 -req \ -in intermediate-ca.csr \ -CA root-ca.pem \ -CAkey root-ca-key.pem \ -CAcreateserial \ -out intermediate-ca.pem \ -days 1825 \ -sha256 \ -extfile <(printf "basicConstraints=critical,CA:TRUE,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign")
Damit entsteht:
intermediate-ca.pem
Wichtig sind:
CA:TRUE pathlen:0
CA:TRUE bedeutet, dass die Intermediate CA Zertifikate ausstellen darf.
pathlen:0 bedeutet, dass sie Endzertifikate ausstellen darf, aber keine weitere untergeordnete CA.
4. Zertifikat ansehen
openssl x509 -in intermediate-ca.pem -text -noout
Jetzt sehen wir:
Issuer: CN = KAPRI Example Root CA Subject: CN = KAPRI Example Intermediate CA
Die Intermediate CA ist der Subject.
Die Root CA ist der Issuer.
Unsere Verbindung ist damit sichtbar:
Root CA → Intermediate CA
5. Verbindung prüfen
openssl verify \ -CAfile root-ca.pem \ intermediate-ca.pem
Das Ergebnis sollte sein:
intermediate-ca.pem: OK
Als Nächstes erzeugen wir die beiden Endzertifikate für Producer und Recipient.
Producer-Zertifikat erzeugen
Der Producer signiert später:
- das Package Manifest;
- KAP Key Delivery Messages.
Dafür benötigt er einen eigenen Private Key und ein Zertifikat, das digitale Signaturen erlaubt.
1. Private Key erzeugen
openssl genpkey \ -algorithm RSA \ -pkeyopt rsa_keygen_bits:3072 \ -out producer-key.pem
Damit entsteht:
producer-key.pem
Dieser Private Key wird später für PS256-Signaturen verwendet und bleibt geheim.
2. Certificate Signing Request erzeugen
openssl req -new \ -key producer-key.pem \ -out producer.csr \ -subj "/CN=KAPRI Example Producer"
3. Producer-Zertifikat ausstellen
Jetzt signiert die Intermediate CA das Producer-Zertifikat:
openssl x509 -req \ -in producer.csr \ -CA intermediate-ca.pem \ -CAkey intermediate-ca-key.pem \ -CAcreateserial \ -out producer.pem \ -days 825 \ -sha256 \ -extfile <(printf "basicConstraints=critical,CA:FALSE\nkeyUsage=critical,digitalSignature")
Damit entsteht:
producer.pem
Wichtig sind:
CA:FALSE digitalSignature
CA:FALSE bedeutet, dass der Producer keine Zertifikate ausstellen darf.
digitalSignature erlaubt die Verwendung seines Schlüssels für digitale Signaturen.
4. Zertifikat ansehen
openssl x509 -in producer.pem -text -noout
Wir sehen:
Issuer: CN = KAPRI Example Intermediate CA Subject: CN = KAPRI Example Producer
Unter Key Usage sollte stehen:
Digital Signature
5. Zertifikatskette prüfen
openssl verify \ -CAfile root-ca.pem \ -untrusted intermediate-ca.pem \ producer.pem
Das Ergebnis sollte sein:
producer.pem: OK
Die Signaturkette des Producers ist damit vollständig:
Producer → Intermediate CA → Root CA
Recipient-Zertifikat erzeugen
Der Recipient benötigt ein eigenes Schlüsselpaar.
Sein Public Key wird verwendet, um File Keys mit RSA-OAEP-256 für diesen Recipient zu verschlüsseln.
Der zugehörige Private Key wird später benötigt, um diese File Keys aus einer KAP-KDM wiederherzustellen.
Das Recipient-Schlüsselpaar ist vom Producer-Schlüsselpaar getrennt.
1. Private Key erzeugen
openssl genpkey \ -algorithm RSA \ -pkeyopt rsa_keygen_bits:3072 \ -out recipient-key.pem
Damit entsteht:
recipient-key.pem
Der Recipient Private Key bleibt geheim und wird nicht an den Producer weitergegeben.
2. Certificate Signing Request erzeugen
openssl req -new \ -key recipient-key.pem \ -out recipient.csr \ -subj "/CN=KAPRI Example Recipient"
3. Recipient-Zertifikat ausstellen
Jetzt signiert die Intermediate CA das Recipient-Zertifikat:
openssl x509 -req \ -in recipient.csr \ -CA intermediate-ca.pem \ -CAkey intermediate-ca-key.pem \ -CAcreateserial \ -out recipient.pem \ -days 825 \ -sha256 \ -extfile <(printf "basicConstraints=critical,CA:FALSE\nkeyUsage=critical,keyEncipherment")
Damit entsteht:
recipient.pem
Wichtig sind:
CA:FALSE keyEncipherment
CA:FALSE bedeutet, dass der Recipient keine Zertifikate ausstellen darf.
keyEncipherment erlaubt die Verwendung des Public Key zur Verschlüsselung von File Keys.
4. Zertifikat ansehen
openssl x509 -in recipient.pem -text -noout
Wir sehen:
Issuer: CN = KAPRI Example Intermediate CA Subject: CN = KAPRI Example Recipient
Unter Key Usage sollte stehen:
Key Encipherment
5. Zertifikatskette prüfen
openssl verify \ -CAfile root-ca.pem \ -untrusted intermediate-ca.pem \ recipient.pem
Das Ergebnis sollte sein:
recipient.pem: OK
Die Zertifikatskette des Recipients ist damit vollständig:
Recipient → Intermediate CA → Root CA
Ergebnis
Unsere Zertifikatsstruktur ist vollständig:
Root CA ↓ Intermediate CA ├── Producer └── Recipient
Wir haben vier Zertifikate:
root-ca.pem intermediate-ca.pem producer.pem recipient.pem
Dazu gehören vier Private Keys:
root-ca-key.pem intermediate-ca-key.pem producer-key.pem recipient-key.pem
Außerdem sind während der Erstellung drei Certificate Signing Requests entstanden:
intermediate-ca.csr producer.csr recipient.csr
Private Keys bleiben geheim.
Zertifikate dürfen weitergegeben werden.
Die Rollen sind klar getrennt:
producer-key.pem └── signiert Package Manifests und KAP-KDMs recipient.pem └── verschlüsselt File Keys für den Recipient recipient-key.pem └── stellt die verschlüsselten File Keys wieder her
Für die Signatur eines Package Manifest wird die Zertifikatskette in dieser Reihenfolge verwendet:
producer.pem intermediate-ca.pem root-ca.pem
Das Recipient-Zertifikat gehört nicht in diese Signaturkette.
Es wird später bei der Erzeugung einer recipient-spezifischen KAP Key Delivery Message verwendet.