Wie erstelle ich meine eigene Zertifikatskette?

62

Ich möchte meinen eigenen OCSP-Responder einrichten (nur zu Testzwecken). Dazu muss ich ein Stammzertifikat und ein paar daraus generierte Zertifikate haben.

Ich habe es geschafft, mit openssl ein selbstsigniertes Zertifikat zu erstellen. Ich möchte es als Root-Zertifikat verwenden. Der nächste Schritt wäre, die abgeleiteten Zertifikate zu erstellen. Ich kann die Dokumentation dazu jedoch nicht finden. Weiß jemand, wo ich diese Informationen finden kann?

Bearbeiten
Im Nachhinein meine Frage ist noch nicht vollständig beantwortet. Um das Problem zu klären, stelle ich meine Zertifikatskette folgendermaßen dar:

Wurzel -> A -> B -> C -> ...

Ich kann derzeit die ROOT- und A-Zertifikate erstellen, habe aber noch nicht herausgefunden, wie eine längere Kette erstellt werden kann.

Mein Befehl zum Erstellen des Stammzertifikats 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

Zertifikat A wird folgendermaßen 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 Stammzertifikat ab, für das er die erforderlichen Informationen in der Konfigurationsdatei openssl findet.

Zertifikat B muss sich jedoch nur auf A verlassen, das nicht in der Konfigurationsdatei registriert ist, sodass der vorherige Befehl hier nicht funktioniert.

Welche Befehlszeile sollte ich verwenden, um Zertifikate B und höher zu erstellen?

Bearbeiten
fand ich die Antwort in diesem Artikel . 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.

StackedCrooked
quelle
Der Link unten im Bearbeitungsbereich ist unterbrochen
enthusiasticgeek
2
Bis 2015 ist der Artikel, der in der letzten Ausgabe dieses Beitrags erwähnt wurde, tot. Sie können die Seite also in einem Webarchiv überprüfen : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip

Antworten:

28

Sie können OpenSSL direkt verwenden.

  1. Erstellen Sie einen privaten Schlüssel der Zertifizierungsstelle (dies ist Ihr wichtigster Schlüssel):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Erstellen Sie Ihr selbstsigniertes CA-Zertifikat:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Stellen Sie ein Client-Zertifikat aus, indem Sie zuerst den Schlüssel generieren, ihn dann anfordern (oder einen von einem externen System bereitgestellten verwenden) und dann das Zertifikat mit dem privaten Schlüssel Ihrer Zertifizierungsstelle signieren:

    openssl genrsa -out client.key 1024
    openssl req -new -key client.key -out client.csr
    openssl ca -in client.csr -out client.cer
    

(Möglicherweise müssen Sie einige Optionen hinzufügen, da ich diese Befehle zusammen mit meiner openssl.conf-Datei verwende. Möglicherweise müssen Sie zuerst Ihre eigene .conf-Datei einrichten.)

twk
quelle
Vielen Dank, Ihre Anweisungen haben nach einigen Optimierungen meiner openssl.conf-Datei funktioniert.
StackedCrooked
3
@twk: Beachten Sie, dass die Frage einen weiteren Schritt für eine vollständige Antwort benötigt - wie ein weiteres Zertifikat erstellt wird, das nur vom in Schritt 3 erstellten Zertifikat abhängt, nicht jedoch vom Stammzertifikat.
Quack Quijote
3
Schlägt im letzten Schritt fehl, wenn der private Schlüssel der Zertifizierungsstelle nicht geladen werden kann. Ich kann auf halbem Weg dorthin gelangen, indem ich den Schlüssel und das Zertifikat mitgebe openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, aber ich möchte ein demoCAVerzeichnis und verschiedene Ausrüstungsgegenstände.
Freitag,
23
"Möglicherweise müssen Sie einige Optionen hinzufügen ..." entfernt das Dienstprogramm wirklich aus dieser Antwort.
Zach
14

Nachdem Sie Ihre Zertifizierungsstelle erstellt haben, können Sie sie folgendermaßen signieren:

  • Erstellen Sie einen Schlüssel:

    openssl genrsa -out key_A.key  1024
    
  • Erstellen Sie eine csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • Unterschreib es :

    openssl x509 -req -days 365 -in csr_A.csr -CA CA_certificate_you_created.crt \
    -CAkey CA_key_you_created.key -set_serial 01 -out crt_A.crt
    

    und so weiter * _A durch * _B und CA_certificate_you_created.crtmit crt_A.crtund CA_key_you_created.keymit ersetzenkey_A.key

Dein Wechsel:

basicConstraints=CA:TRUE  # prev value was FALSE

bedeutet, dass die von Ihnen ausgestellten Zertifikate zum Signieren anderer Zertifikate verwendet werden können.

Mr_and_Mrs_D
quelle
Vielen Dank, sehr hilfreich
Flotto
1
Welche .crt-Datei?
MickyD
9

OpenSSL wird mit einem Perl-Skript "CA.pl" geliefert, mit dem Sie ein selbstsigniertes CA- Stammzertifikat zusammen mit dem entsprechenden privaten Schlüssel erstellen können. Außerdem werden einige einfache Dateien und Verzeichnisse bereitgestellt, mit deren Hilfe Sie den Überblick über zukünftige Zertifikate behalten können, die Sie signieren (auch als Problem bezeichnet) ) mit dieser Stammzertifizierungsstelle. Sie können auch andere Schlüsselpaare und Zertifikatsignierungsanforderungen (Certificate Signing Requests, CSRs) generieren und diese CSRs verarbeiten (dh Zertifikate ausstellen) und vieles mehr.

Beachten Sie, dass für viele Produkte CA-Zertifikate ein bestimmtes Attribut enthalten müssen, das sie als CA-Zertifikate kennzeichnet, oder dass sie nicht als gültige Unterzeichner / Aussteller anderer Zertifikate akzeptiert werden. Wenn das selbstsignierte Zertifikat, das Sie erstellt haben, dieses Attribut nicht enthält, haben Sie möglicherweise Probleme, andere Software dazu zu bringen, es wie ein gültiges Stammzertifizierungsstellenzertifikat zu behandeln.

Wenn ich mich richtig erinnere, sieht die Syntax ungefähr so ​​aus:

CA.pl -newca    # Create a new root CA  

CA.pl -newreq   # Create a new CSR

CA.pl -sign     # Sign a CSR, creating a cert  

CA.pl -pkcs12   # Turn an issued cert, plus its matching private key and trust chain, into a .p12 file you can install on another machine    
Spiff
quelle
4
Das war hilfreich. Auf Ubuntu 14.04 fand ich die Datei bei/usr/lib/ssl/misc/CA.pl
Colin M
-1

Ich fand diesen Beitrag: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Es ist für Node.JS, aber das Skript in diesem GitHub- Repository verwendet openSLL-Befehle, um ein Stammzertifizierungsstellenzertifikat und ein Domänenzertifikat zu erstellen.

Ausführen mit: bash make-root-ca-and-certificates.sh 'example.com'

Oder für localhost mit: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificates.sh

#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p certs/{server,client,ca,tmp}

# Create your very own Root Certificate Authority
openssl genrsa \
  -out certs/ca/my-root-ca.key.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key certs/ca/my-root-ca.key.pem \
  -days 1024 \
  -out certs/ca/my-root-ca.crt.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out certs/server/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key certs/server/privkey.pem \
  -out certs/tmp/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
# -CAserial certs/ca/my-root-ca.srl
openssl x509 \
  -req -in certs/tmp/csr.pem \
  -CA certs/ca/my-root-ca.crt.pem \
  -CAkey certs/ca/my-root-ca.key.pem \
  -CAcreateserial \
  -out certs/server/cert.pem \
  -days 500

# Create a public key, for funzies
# see https://gist.github.com/coolaj86/f6f36efce2821dfb046d
openssl rsa \
  -in certs/server/privkey.pem \
  -pubout -out certs/client/pubkey.pem

# Put things in their proper place
rsync -a certs/ca/my-root-ca.crt.pem certs/server/chain.pem
rsync -a certs/ca/my-root-ca.crt.pem certs/client/chain.pem
cat certs/server/cert.pem certs/server/chain.pem > certs/server/fullchain.pem
Ralph Bisschops
quelle