Wie kann ich meine eigene Zertifikatskette erstellen?
Ich möchte meinen eigenen OCSP-Responder einrichten (nur zu Testzwecken). Dazu benötige ich ein Root-Zertifikat und ein paar daraus generierte Zertifikate.
Ich habe es geschafft, ein selbstsigniertes Zertifikat mit openssl zu erstellen. Ich möchte es als Root-Zertifikat verwenden. Der nächste Schritt wäre, die abgeleiteten Zertifikate zu erstellen. Ich kann aber keine Dokumentation finden, wie man das macht. Weiß jemand, wo ich diese Informationen finden kann?
Edit Im Nachhinein betrachtet ist meine Frage noch nicht ganz beantwortet. Um das Problem zu verdeutlichen, stelle ich meine Zertifikatskette wie folgt dar:
ROOT -> A -> B -> C -> …
Ich bin derzeit in der Lage, die ROOT- und A-Zertifikate zu erstellen, aber ich habe nicht herausgefunden, wie ich eine längere Kette erstellen kann.
Mein Befehl zum Erstellen des Root-Zertifikats lautet:
openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
Das Zertifikat A wird wie folgt erstellt:
openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl ca -in client.csr -out client.cer
Dieser Befehl hängt implizit vom Root-Zertifikat ab, für das er die erforderlichen Informationen in der openssl-Konfigurationsdatei findet.
Zertifikat B muss sich jedoch nur auf A verlassen, das nicht in der Konfigurationsdatei eingetragen ist, so dass der vorherige Befehl hier nicht funktionieren wird.
Welche Befehlszeile sollte ich verwenden, um Zertifikate B und darüber hinaus zu erstellen?
Edit Die Antwort habe ich in diesem Artikel gefunden. Zertifikat B (Kette A -> B) kann mit diesen beiden Befehlen erstellt werden:
# Create a certificate request
openssl req -new -keyout B.key -out B.request -days 365
# Create and sign the certificate
openssl ca -policy policy_anything -keyfile A.key -cert A.pem -out B.pem -infiles B.request
Ich habe auch die Datei openssl.cnf geändert:
[usr_cert]
basicConstraints=CA:TRUE # prev value was FALSE
Dieser Ansatz scheint gut zu funktionieren.