PKI-Lab mit Root-CA und Teilnehmer-CA: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(44 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=PKI-Lab mit Root-CA und Teilnehmer-CAs=
+
=Schaubild=
 +
{{#drawio:root-ca-teilner-ca}}
  
In diesem Lab wird eine einfache Public Key Infrastructure aufgebaut.
+
=PKI mit Root-CA und Sub-CA (Beispiel it213)=
Der Trainer betreibt eine Root-CA. Die Teilnehmer erstellen eigene CAs, die von der Root-CA signiert werden.
 
Mit diesen Teilnehmer-CAs werden anschließend Server-Zertifikate erzeugt.
 
  
==Root-CA erstellen (Trainer)==
+
In diesem Beispiel wird eine einfache PKI aufgebaut.
Der Trainer erzeugt eine selbstsignierte Root-CA.
+
 
 +
Der Trainer betreibt eine Root-CA.
 +
 
 +
Die Teilnehmer erzeugen eine Sub-CA, die von der Root-CA signiert wird.
 +
 
 +
Mit dieser Sub-CA werden anschließend Server-Zertifikate signiert.
 +
 
 +
 
 +
==Root-CA erstellen==
 +
 
 +
Die Root-CA ist der Vertrauensanker der PKI und ist selbstsigniert.
  
 
*openssl req -new -x509 -newkey rsa:4096 -nodes -keyout ca.key -out ca.crt -days 3650 -subj "/CN=Kit Root CA"
 
*openssl req -new -x509 -newkey rsa:4096 -nodes -keyout ca.key -out ca.crt -days 3650 -subj "/CN=Kit Root CA"
  
Das Zertifikat wird anschließend angezeigt und kontrolliert.
+
Das Zertifikat kann anschließend kontrolliert werden.
  
 
*openssl x509 -in ca.crt -text -noout
 
*openssl x509 -in ca.crt -text -noout
Zeile 16: Zeile 25:
  
 
==Root-CA auf Clients installieren==
 
==Root-CA auf Clients installieren==
Damit Clients Zertifikaten vertrauen, die von dieser PKI ausgestellt werden,
+
 
muss die Root-CA im Trust-Store des Systems installiert werden.
+
Damit Clients den Zertifikaten vertrauen, muss die Root-CA im Trust-Store installiert werden.
 +
 
  
 
===Debian===
 
===Debian===
 +
 
Das Root-Zertifikat wird in den lokalen CA-Speicher kopiert.
 
Das Root-Zertifikat wird in den lokalen CA-Speicher kopiert.
  
Zeile 30: Zeile 41:
  
 
===Rocky / RHEL===
 
===Rocky / RHEL===
 +
 
Das Root-Zertifikat wird in den Anchor-Store kopiert.
 
Das Root-Zertifikat wird in den Anchor-Store kopiert.
  
Zeile 37: Zeile 49:
  
 
*update-ca-trust extract
 
*update-ca-trust extract
 +
=== Firefox / Chrome / Mozilla ===
 +
;Müssen getrennt importiert werden.
  
 +
==Sub-CA Request erzeugen (Beispiel it213)==
  
==Teilnehmer erstellt CA Request (Beispiel it213)==
+
Der Teilnehmer erzeugt einen privaten Schlüssel und eine Certificate Signing Request für seine CA.
Der Teilnehmer erzeugt einen privaten Schlüssel und eine Certificate Signing Request
+
*CA=it213
für seine eigene CA.
+
*mkdir intermediata-ca
 +
*cd intermediata-ca
 +
*openssl req -new -newkey rsa:4096 -nodes -keyout $CA-ca.key -out $CA-ca.csr -subj "/CN=$CA Lab CA"
  
*openssl req -new -newkey rsa:4096 -nodes -keyout it213-ca.key -out it213-ca.csr -subj "/CN=it213 Lab CA"
+
==Der Certificate Signing Request muss nun zur Zertifizierungsstelle==
 +
*http://dnsgw.int
  
 +
==Sub-CA durch Root signieren==
  
==Trainer signiert Teilnehmer-CA==
 
 
Die Root-CA signiert die Teilnehmer-CA. Dadurch entsteht die Zertifikatskette.
 
Die Root-CA signiert die Teilnehmer-CA. Dadurch entsteht die Zertifikatskette.
  
*openssl x509 -req -in it213-ca.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out it213-ca.crt -days 365
+
*openssl x509 -req -in it213-ca.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out it213-ca.crt -days 1460 -extfile <(printf "basicConstraints=CA:TRUE\nkeyUsage=keyCertSign,cRLSign")
  
 +
Das signierte CA-Zertifikat kann kontrolliert werden.
  
==Teilnehmer prüft seine CA==
+
*openssl x509 -in it213-ca.crt -text -noout
Der Teilnehmer kontrolliert sein signiertes CA-Zertifikat.
 
  
*openssl x509 -in it213-ca.crt -text -noout
+
==Die Zertifikate können nun hier runtergeladen werden==
 +
*http://dnsgw.int/uploads
 +
 
 +
==Hinweis zum privaten Schlüssel==
 +
 
 +
Der private Schlüssel der CA wird nur zum Signieren von Zertifikaten benötigt.
 +
 
 +
Zum Prüfen der Zertifikatskette werden nur die öffentlichen Zertifikate verwendet.
 +
 
 +
Beispiel:
 +
 
 +
<pre>
 +
www.it213.int.crt
 +
it213-ca.crt
 +
ca.crt
 +
</pre>
 +
 
 +
Die Prüfung erfolgt über die Signaturen der Zertifikate.
  
  
 
==Server-Schlüssel und CSR erzeugen==
 
==Server-Schlüssel und CSR erzeugen==
Der Teilnehmer erzeugt einen privaten Schlüssel und eine CSR für seinen Webserver.
+
;Variable setzen
 +
*CA=it213-ca
 +
*FQDN=www.it213.int
 +
Der Teilnehmer erzeugt einen Schlüssel und eine CSR für seinen Server.
 +
;Erstellen
 +
*openssl req -new -newkey rsa:2048 -nodes -keyout $FQDN.key -out $FQDN.csr -subj "/CN=$FQDN"
 +
;Anzeigen
 +
*openssl req -in $FQDN.csr -text -noout
 +
 
 +
==Server-Zertifikat signieren==
  
*openssl req -new -newkey rsa:2048 -nodes -keyout web.key -out web.csr -subj "/CN=web.it213.lab"
+
Die Sub-CA signiert das Server-Zertifikat und fügt einen Subject Alternative Name hinzu.
 +
;Signieren
 +
*openssl x509 -req -in $FQDN.csr -CA  $CA.crt -CAkey $CA.key -CAcreateserial -out $FQDN.crt -days 365 -extfile <(printf "subjectAltName=DNS:$FQDN")
  
 +
;Anzeigen
 +
*openssl x509 -in $FQDN.crt -text -noout
  
==Server-Zertifikat signieren==
+
==Fullchain erstellen==
Die Teilnehmer-CA signiert das Server-Zertifikat.
+
 
 +
Damit Clients die Zertifikatskette aufbauen können, muss der Server die Intermediate-CA mitliefern.
  
*openssl x509 -req -in web.csr -CA it213-ca.crt -CAkey it213-ca.key -CAcreateserial -out web.crt -days 365
+
Dazu wird eine Fullchain-Datei erstellt.
  
 +
*cat $FQDN.crt $CA.crt > $FQDN-fullchain.pem
  
==Zertifikat prüfen==
+
Die Reihenfolge ist wichtig.
Das fertige Server-Zertifikat wird angezeigt.
 
  
*openssl x509 -in web.crt -text -noout
+
<pre>
 +
www.it213.int.crt
 +
it213-ca.crt
 +
</pre>
  
 +
==Zum Ziel kopieren==
 +
*scp $FQDN-fullchain.pem $FQDN.key kit@$FQDN:
  
 
==Zertifikatskette prüfen==
 
==Zertifikatskette prüfen==
Die komplette Zertifikatskette wird überprüft.
 
  
*openssl verify -CAfile ca.crt -untrusted it213-ca.crt web.crt
+
Die komplette Zertifikatskette kann mit OpenSSL überprüft werden.
  
 +
*openssl verify -CAfile ca.crt -untrusted it213-ca.crt www.it213.int.crt
  
==PKI-Struktur im Lab==
+
 
 +
==PKI-Struktur==
 +
 
 +
<pre>
 
Kit Root CA
 
Kit Root CA
├── it201-ca
 
├── it202-ca
 
├── it203-ca
 
├── ...
 
 
  └── it213-ca
 
  └── it213-ca
       └── web.it213.lab
+
       └── www.it213.int
 +
</pre>
 +
 
 +
Der Client kennt die Root-CA aus dem Trust-Store.
 +
 
 +
Der Server liefert beim TLS-Handshake das Server-Zertifikat und die Sub-CA.
 +
 
 +
Der Client kann damit die vollständige Zertifikatskette prüfen.
 +
 
 +
== Troubleshooting: OpenSSL & PKI Fehler ==
 +
 
 +
{| class="wikitable"
 +
! Fehlermeldung / Symptom !! Mögliche Ursache !! Lösung
 +
|-
 +
| '''"Self-signed certificate in certificate chain"'''
 +
| Der Client vertraut der Root-CA nicht oder die Root-CA wurde nicht im Trust-Store installiert.
 +
| Prüfen, ob '''update-ca-certificates''' (Debian) oder '''update-ca-trust''' (Rocky) ausgeführt wurde. Browser ggf. neu starten.
 +
|-
 +
| '''"Depth lookup: unable to get local issuer certificate"'''
 +
| Die Intermediate-CA (Sub-CA) fehlt in der Kette, die der Server ausliefert.
 +
| Prüfen, ob die Datei '''fullchain.pem''' korrekt erstellt wurde (Reihenfolge!) und im Webserver (SSLCertificateFile / ssl_certificate) eingebunden ist.
 +
|-
 +
| '''"Certificate is not valid for 'xyz.int'"'''
 +
| Der '''Subject Alternative Name (SAN)''' fehlt oder ist falsch geschrieben.
 +
| Zertifikat prüfen mit: <nowiki>openssl x509 -in cert.crt -text</nowiki> -> Suche nach "X509v3 Subject Alternative Name".
 +
|-
 +
| '''"Verification error: certificate has expired"'''
 +
| Systemzeit auf Server oder Client ist falsch (häufig bei VMs nach Suspend).
 +
| Datum/Uhrzeit mit dem Befehl <nowiki>date</nowiki> prüfen und ggf. per NTP synchronisieren.
 +
|-
 +
| '''"Modulus mismatch"'''
 +
| Der private Schlüssel passt kryptografisch nicht zum vorliegenden Zertifikat.
 +
| Vergleichen der MD5-Hashes beider Dateien (siehe unten unter "Nützliche Befehle").
 +
|-
 +
| '''"CA:FALSE" bei der Sub-CA'''
 +
| Die Sub-CA wurde ohne die Extension '''basicConstraints=CA:TRUE''' signiert.
 +
| Die Sub-CA ist nicht berechtigt, weitere Zertifikate zu signieren. Sub-CA mit den richtigen Extensions neu erstellen.
 +
|}
 +
 
 +
== Nützliche Prüfbefehle für die Administration ==
 +
 
 +
=== Modulus-Check (Passen Key und CRT zusammen?) ===
 +
Um sicherzustellen, dass ein Zertifikat zu einem Private Key gehört, müssen die Modulus-Hashes identisch sein:
 +
* <pre>openssl x509 -noout -modulus -in www.it213.int.crt | openssl md5</pre>
 +
* <pre>openssl rsa -noout -modulus -in www.it213.int.key | openssl md5</pre>
 +
 
 +
=== TLS-Handshake live testen ===
 +
Simuliert einen Verbindungsaufbau und zeigt die vom Server gesendete Zertifikatskette an:
 +
* <pre>openssl s_client -connect localhost:443 -showcerts</pre>
 +
 
 +
=== Zertifikatsinhalt schnell prüfen ===
 +
* <pre>openssl x509 -in fullchain.pem -text -noout</pre>
 +
 
 +
 
 +
 
  
Die Root-CA signiert die Teilnehmer-CAs.
+
*[[Python Webserver mit SSL/TL]]
Die Teilnehmer-CAs signieren anschließend ihre eigenen Server-Zertifikate.
 

Aktuelle Version vom 3. Juni 2026, 14:27 Uhr

Schaubild

PKI mit Root-CA und Sub-CA (Beispiel it213)

In diesem Beispiel wird eine einfache PKI aufgebaut.

Der Trainer betreibt eine Root-CA.

Die Teilnehmer erzeugen eine Sub-CA, die von der Root-CA signiert wird.

Mit dieser Sub-CA werden anschließend Server-Zertifikate signiert.


Root-CA erstellen

Die Root-CA ist der Vertrauensanker der PKI und ist selbstsigniert.

  • openssl req -new -x509 -newkey rsa:4096 -nodes -keyout ca.key -out ca.crt -days 3650 -subj "/CN=Kit Root CA"

Das Zertifikat kann anschließend kontrolliert werden.

  • openssl x509 -in ca.crt -text -noout


Root-CA auf Clients installieren

Damit Clients den Zertifikaten vertrauen, muss die Root-CA im Trust-Store installiert werden.


Debian

Das Root-Zertifikat wird in den lokalen CA-Speicher kopiert.

  • cp ca.crt /usr/local/share/ca-certificates/

Der Trust-Store wird aktualisiert.

  • update-ca-certificates


Rocky / RHEL

Das Root-Zertifikat wird in den Anchor-Store kopiert.

  • cp ca.crt /etc/pki/ca-trust/source/anchors/

Der System Trust Store wird neu erzeugt.

  • update-ca-trust extract

Firefox / Chrome / Mozilla

Müssen getrennt importiert werden.

Sub-CA Request erzeugen (Beispiel it213)

Der Teilnehmer erzeugt einen privaten Schlüssel und eine Certificate Signing Request für seine CA.

  • CA=it213
  • mkdir intermediata-ca
  • cd intermediata-ca
  • openssl req -new -newkey rsa:4096 -nodes -keyout $CA-ca.key -out $CA-ca.csr -subj "/CN=$CA Lab CA"

Der Certificate Signing Request muss nun zur Zertifizierungsstelle

Sub-CA durch Root signieren

Die Root-CA signiert die Teilnehmer-CA. Dadurch entsteht die Zertifikatskette.

  • openssl x509 -req -in it213-ca.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out it213-ca.crt -days 1460 -extfile <(printf "basicConstraints=CA:TRUE\nkeyUsage=keyCertSign,cRLSign")

Das signierte CA-Zertifikat kann kontrolliert werden.

  • openssl x509 -in it213-ca.crt -text -noout

Die Zertifikate können nun hier runtergeladen werden

Hinweis zum privaten Schlüssel

Der private Schlüssel der CA wird nur zum Signieren von Zertifikaten benötigt.

Zum Prüfen der Zertifikatskette werden nur die öffentlichen Zertifikate verwendet.

Beispiel:

www.it213.int.crt
it213-ca.crt
ca.crt

Die Prüfung erfolgt über die Signaturen der Zertifikate.


Server-Schlüssel und CSR erzeugen

Variable setzen
  • CA=it213-ca
  • FQDN=www.it213.int

Der Teilnehmer erzeugt einen Schlüssel und eine CSR für seinen Server.

Erstellen
  • openssl req -new -newkey rsa:2048 -nodes -keyout $FQDN.key -out $FQDN.csr -subj "/CN=$FQDN"
Anzeigen
  • openssl req -in $FQDN.csr -text -noout

Server-Zertifikat signieren

Die Sub-CA signiert das Server-Zertifikat und fügt einen Subject Alternative Name hinzu.

Signieren
  • openssl x509 -req -in $FQDN.csr -CA $CA.crt -CAkey $CA.key -CAcreateserial -out $FQDN.crt -days 365 -extfile <(printf "subjectAltName=DNS:$FQDN")
Anzeigen
  • openssl x509 -in $FQDN.crt -text -noout

Fullchain erstellen

Damit Clients die Zertifikatskette aufbauen können, muss der Server die Intermediate-CA mitliefern.

Dazu wird eine Fullchain-Datei erstellt.

  • cat $FQDN.crt $CA.crt > $FQDN-fullchain.pem

Die Reihenfolge ist wichtig.

www.it213.int.crt
it213-ca.crt

Zum Ziel kopieren

  • scp $FQDN-fullchain.pem $FQDN.key kit@$FQDN:

Zertifikatskette prüfen

Die komplette Zertifikatskette kann mit OpenSSL überprüft werden.

  • openssl verify -CAfile ca.crt -untrusted it213-ca.crt www.it213.int.crt


PKI-Struktur

Kit Root CA
 └── it213-ca
      └── www.it213.int

Der Client kennt die Root-CA aus dem Trust-Store.

Der Server liefert beim TLS-Handshake das Server-Zertifikat und die Sub-CA.

Der Client kann damit die vollständige Zertifikatskette prüfen.

Troubleshooting: OpenSSL & PKI Fehler

Fehlermeldung / Symptom Mögliche Ursache Lösung
"Self-signed certificate in certificate chain" Der Client vertraut der Root-CA nicht oder die Root-CA wurde nicht im Trust-Store installiert. Prüfen, ob update-ca-certificates (Debian) oder update-ca-trust (Rocky) ausgeführt wurde. Browser ggf. neu starten.
"Depth lookup: unable to get local issuer certificate" Die Intermediate-CA (Sub-CA) fehlt in der Kette, die der Server ausliefert. Prüfen, ob die Datei fullchain.pem korrekt erstellt wurde (Reihenfolge!) und im Webserver (SSLCertificateFile / ssl_certificate) eingebunden ist.
"Certificate is not valid for 'xyz.int'" Der Subject Alternative Name (SAN) fehlt oder ist falsch geschrieben. Zertifikat prüfen mit: openssl x509 -in cert.crt -text -> Suche nach "X509v3 Subject Alternative Name".
"Verification error: certificate has expired" Systemzeit auf Server oder Client ist falsch (häufig bei VMs nach Suspend). Datum/Uhrzeit mit dem Befehl date prüfen und ggf. per NTP synchronisieren.
"Modulus mismatch" Der private Schlüssel passt kryptografisch nicht zum vorliegenden Zertifikat. Vergleichen der MD5-Hashes beider Dateien (siehe unten unter "Nützliche Befehle").
"CA:FALSE" bei der Sub-CA Die Sub-CA wurde ohne die Extension basicConstraints=CA:TRUE signiert. Die Sub-CA ist nicht berechtigt, weitere Zertifikate zu signieren. Sub-CA mit den richtigen Extensions neu erstellen.

Nützliche Prüfbefehle für die Administration

Modulus-Check (Passen Key und CRT zusammen?)

Um sicherzustellen, dass ein Zertifikat zu einem Private Key gehört, müssen die Modulus-Hashes identisch sein:

  • openssl x509 -noout -modulus -in www.it213.int.crt | openssl md5
  • openssl rsa -noout -modulus -in www.it213.int.key | openssl md5

TLS-Handshake live testen

Simuliert einen Verbindungsaufbau und zeigt die vom Server gesendete Zertifikatskette an:

  • openssl s_client -connect localhost:443 -showcerts

Zertifikatsinhalt schnell prüfen

  • openssl x509 -in fullchain.pem -text -noout