Während meiner Suche habe ich verschiedene Möglichkeiten zum Signieren einer SSL-Zertifikatsignierungsanforderung gefunden:
Verwenden des
x509
Moduls:openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Verwenden des
ca
Moduls:openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
Hinweis: Ich bin mir nicht sicher, ob die richtigen Parameter für diesen verwendet werden. Bitte geben Sie die korrekte Verwendung an, wenn ich sie verwenden soll.
Wie sollte man Zertifikatsanforderungen bei Ihrer Zertifizierungsstelle signieren? Ist eine Methode besser als die andere (zum Beispiel eine, die veraltet ist)?
ca
handelt es sich um Fälle, in denen Sie es ernst meinen, CA zu werden.Antworten:
Ihnen fehlt der Auftakt zu diesen Befehlen.
Dies ist ein zweistufiger Prozess. Zuerst richten Sie Ihre Zertifizierungsstelle ein und dann signieren Sie ein Endentitätszertifikat (auch bekannt als Server oder Benutzer). Beide Befehle teilen die beiden Schritte in einen. Beide setzen voraus, dass bereits eine OpenSSL-Konfigurationsdatei für Zertifizierungsstellen und Serverzertifikate (Endentität) eingerichtet ist.
Erstellen Sie zunächst eine grundlegende Konfigurationsdatei :
Fügen Sie dann Folgendes hinzu:
Die obigen Felder stammen aus einem komplexeren Feld
openssl.cnf
(Sie finden es in/usr/lib/openssl.cnf
), aber ich denke, sie sind die Grundvoraussetzungen für die Erstellung des CA-Zertifikats und des privaten Schlüssels.Passen Sie die Felder oben an Ihren Geschmack an. Die Standardeinstellungen ersparen Ihnen die Zeit, dieselben Informationen einzugeben, während Sie mit Konfigurationsdateien und Befehlsoptionen experimentieren.
Ich habe die CRL-relevanten Dinge weggelassen, aber Ihre CA-Operationen sollten sie haben. Siehe
openssl.cnf
und den zugehörigencrl_ext
Abschnitt.Führen Sie dann Folgendes aus. Das
-nodes
lässt das Passwort oder die Passphrase weg, damit Sie das Zertifikat überprüfen können. Es ist eine wirklich schlechte Idee, das Passwort oder die Passphrase wegzulassen.Nachdem der Befehl ausgeführt wurde,
cacert.pem
ist dies Ihr Zertifikat für CA-Vorgänge undcakey.pem
der private Schlüssel. Der private Schlüssel hat kein Passwort oder keine Passphrase.Sie können das Zertifikat wie folgt sichern.
Testen Sie den Zweck folgendermaßen (machen Sie sich keine Sorgen über
Any Purpose: Yes
; siehe "kritisch, CA: FALSE", aber "CA für alle Zwecke: Ja" ).Für Teil zwei werde ich eine weitere Konfigurationsdatei erstellen, die leicht verdaulich ist. Erstens
touch
dieopenssl-server.cnf
(Sie können eine davon auch für Benutzerzertifikate erstellen).Öffnen Sie es dann und fügen Sie Folgendes hinzu.
Wenn Sie Ihre Workstation entwickeln und als Server verwenden müssen, müssen Sie möglicherweise Folgendes für Chrome tun. Andernfalls kann sich Chrome beschweren, dass ein allgemeiner Name ungültig ist (
ERR_CERT_COMMON_NAME_INVALID
) . Ich bin mir nicht sicher, wie die Beziehung zwischen einer IP-Adresse im SAN und einem CN in diesem Fall ist.Erstellen Sie dann die Serverzertifikatsanforderung. Achten Sie darauf, * wegzulassen
-x509
. Durch Hinzufügen-x509
wird ein Zertifikat erstellt und keine Anforderung.Nachdem dieser Befehl ausgeführt wurde, haben Sie eine Anforderung
servercert.csr
und einen privaten Schlüsselserverkey.pem
.Und Sie können es erneut überprüfen.
Als nächstes müssen Sie es mit Ihrer CA unterschreiben.
Sie sind fast bereit, das Serverzertifikat von Ihrer Zertifizierungsstelle zu signieren. Die Zertifizierungsstellen
openssl-ca.cnf
benötigen zwei weitere Abschnitte, bevor der Befehl ausgegeben wird.Öffnen
openssl-ca.cnf
Sie zunächst die folgenden beiden Abschnitte und fügen Sie sie hinzu.Zweitens fügen Sie dem
[ CA_default ]
Abschnitt von Folgendes hinzuopenssl-ca.cnf
. Ich habe sie früher weggelassen, weil sie die Dinge komplizieren können (sie waren zu der Zeit unbenutzt). Jetzt werden Sie sehen, wie sie verwendet werden, und hoffentlich machen sie Sinn.Drittens berühren
index.txt
undserial.txt
:Führen Sie dann Folgendes aus:
Sie sollten Folgendes ähnlich sehen:
Nachdem der Befehl ausgeführt wurde, haben Sie ein frisch geprägtes Serverzertifikat in
servercert.pem
. Der private Schlüssel wurde früher erstellt und ist in verfügbarserverkey.pem
.Schließlich können Sie Ihr frisch geprägtes Zertifikat wie folgt überprüfen:
Zuvor haben Sie Folgendes hinzugefügt zu
CA_default
:copy_extensions = copy
. Diese kopiert die Erweiterung, die von der Person bereitgestellt wurde, die die Anfrage gestellt hat.Wenn Sie dies weglassen
copy_extensions = copy
, fehlen Ihrem Serverzertifikat die SANs (Subject Alternate Names) wiewww.example.com
undmail.example.com
.Wenn Sie
copy_extensions = copy
die Anforderung verwenden , diese jedoch nicht überprüfen, kann der Anforderer Sie möglicherweise dazu verleiten, so etwas wie einen untergeordneten Stamm (anstelle eines Server- oder Benutzerzertifikats) zu signieren. Dies bedeutet, dass er / sie Zertifikate prägen kann, die mit Ihrer vertrauenswürdigen Wurzel verknüpft sind. Stellen Sie sicher, dass Sie die Anfrage mit überprüfen,openssl req -verify
bevor Sie unterschreiben.Wenn Sie es weglassen
unique_subject
oder festlegenyes
, dürfen Sie nur ein Zertifikat unter dem definierten Namen des Betreffs erstellen .Der Versuch, während des Experimentierens ein zweites Zertifikat zu erstellen, führt zu folgenden Ergebnissen, wenn Sie das Zertifikat Ihres Servers mit dem privaten Schlüssel der Zertifizierungsstelle signieren:
Ist
unique_subject = no
also perfekt zum Testen.Wenn Sie die sicherstellen wollen , den Namen der Organisation steht im Einklang zwischen selbstsignierte Zertifizierungsuntergeordnete CA und End-Entity - Zertifikate, dann fügen Sie die folgende Zeile in Ihre CA - Konfigurationsdateien:
Wenn Sie zulassen möchten, dass sich der Organisationsname ändert, verwenden Sie:
Es gibt andere Regeln für den Umgang mit DNS-Namen in X.509 / PKIX-Zertifikaten. In diesen Dokumenten finden Sie die Regeln:
RFC 6797 und RFC 7469 werden aufgelistet, da sie restriktiver sind als die anderen RFCs und CA / B-Dokumente. Die RFC 6797 und 7469 erlauben ebenfalls keine IP-Adresse.
quelle
openssl req
wird zum Generieren von CSR verwendet,openssl req -x509
wird zum Generieren eines CA-Zertifikats verwendet (ich habe gesehen, dass Sie an einer anderen Stelle auch ein selbstsigniertes Zertifikat erstellen können),openssl ca
wird zum Signieren eines CSR mit einem CA-Zertifikat verwendet. Richtig? Was mich auch verwirrt, ist, dass die gleichen Teile der Datei openssl.cnf je nach Befehl mit unterschiedlichen Werten verwendet werden ... Ich glaube, ich bin jetzt total verloren.openssl req -x509
wird die Zertifizierungsstelle erstellt. Zweitensopenssl req
wird verwendet, um die CSR des Servers zu erstellen. Drittensopenssl ca
wird das Serverzertifikat erstellt und mit der Signatur der Zertifizierungsstelle zertifiziert.openssl-ca.cnf
und ausgebrochenopenssl-server.cnf
. Nachdem Sie sich an sie gewöhnt haben und wie die Abschnitte aufgerufen werden, können Sie sie zu einer Monstrosität wie kombinierenopenssl.cnf
.Zusätzlich zur Antwort von @jww möchte ich sagen, dass die Konfiguration in openssl-ca.cnf,
Definiert die Standardanzahl der Tage, an denen das von diesem Root-Ca signierte Zertifikat gültig ist. Um die Gültigkeit von root-ca selbst festzulegen, sollten Sie die Option '-days n' verwenden in:
Andernfalls ist Ihr root-ca nur für den Standardmonat gültig, und jedes von dieser Stammzertifizierungsstelle signierte Zertifikat hat auch eine Gültigkeit von einem Monat.
quelle