Eine eigene Zertifikatskette aufbauen

Wir erstellen eine Zertifikatskette mit Root CA, Intermediate CA sowie getrennten Zertifikaten für Producer und Recipient.

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.


Diese Website verwendet Cookies, um Ihnen die bestmögliche Nutzererfahrung zu bieten. Mehr erfahren

Kontakt

Wir freuen uns auf Ihre Nachricht.

Mit dem Absenden akzeptieren Sie unsere Datenschutzerklärung

Login