Vermeiden Sie die Aufforderung zur Eingabe eines Kennworts für Schlüssel und zur Eingabe von DN-Informationen

73619
jww

Ich verwende folgenden Code zum Generieren von Schlüsseln:

apt-get -qq -y install openssl; mkdir -p /etc/apache2/ssl; openssl genrsa -des3 -out server.key 1024; openssl req -new -key server.key -out server.csr; cp server.key server.key.org; openssl rsa -in server.key.org -out server.key; openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt; mv server.crt /etc/apache2/ssl/cert.pem; mv server.key /etc/apache2/ssl/cert.key; rm -f server.key.orig; rm -f server.csr 

Ich habe zwei Fragen:

  1. Wie kann ich die Passworteingabe überspringen? Wäre es ungefährlich für mich, dies zu tun? (da sollte es nicht geradezu dumm sein, als ob jemand das Zertifikat hacken könnte)

  2. Wie vermeide ich die Aufforderung zur Eingabe des Ländernamens, der Organisation usw. Ich hoffe, ich kann sie an der Eingabeaufforderung angeben (die Manpage zeigt nur Optionen auf oberster Ebene für OpenSSL).

85

5 Antworten auf die Frage

139
bahamat

Edit: Dies ist bei weitem meine beliebteste Antwort, und es ist jetzt ein paar Jahre her, also habe ich eine ECDSA-Variante hinzugefügt. Wenn Sie ECDSA verwenden können, sollten Sie dies tun.


Sie können alle diese Informationen in der Befehlszeile angeben.

Eine selbstsignierte, kennwortlose Zertifikatserzeugung in einem Schritt:

RSA-Version

openssl req \ -new \ -newkey rsa:4096 \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \ -keyout www.example.com.key \ -out www.example.com.cert 

ECDSA-Version

openssl req \ -new \ -newkey ec \ -pkeyopt ec_paramgen_curve:prime256v1 \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \ -keyout www.example.com.key \ -out www.example.com.cert 

Alle openssl-Unterbefehle haben eine eigene Manpage. Siehe man req.


Spezifisch auf Ihre Fragen eingehen und genauer sagen, welche Optionen in Kraft sind:

  1. Das -nodesFlag signalisiert, den Schlüssel nicht zu verschlüsseln, daher benötigen Sie kein Passwort. Sie können auch die -passout argFlagge verwenden. Siehe PASS PHRASE ARGUMENTSin der openssl(1)man - Seite, wie Sie die arg zu formatieren.

  2. Mit der -subjMarkierung können Sie das Thema angeben (Beispiel oben).

Das Lesen von Sachen über "-subj" funktioniert jedoch - für mich - nur dann, wenn OPENSSL_CONF NICHT gesetzt ist. IOW: Wenn OPENSSL_CONF gesetzt ist, versucht OpenSSL von dort aus zu lesen und das Befehlszeilenargument _ignore_ "-subj". Ich habe eine Weile gebraucht, um es herauszufinden. oberstet vor 12 Jahren 3
oberstet: Ja, das stimmt. bahamat vor 12 Jahren 0
Ist es möglich, den Betreff _key_ selbst von stdin zu übergeben? Ich habe "-key stdin", "-key fd: 1" und "-key -" ausprobiert ... ohne Glück. oberstet vor 12 Jahren 0
Ich habe das Q aufgeteilt: http://superuser.com/questions/407874/openssl-csr-generation-with-subject-key-from-stdin oberstet vor 12 Jahren 0
Unterstützt dies einen Platzhalter? Cerin vor 11 Jahren 0
Wenn Sie eine Platzhalter-CN meinen, sollte dies der Fall sein. Obwohl ich es nicht probiert habe. bahamat vor 11 Jahren 0
Ist es möglich, die Optionen -CA und -CAkey in diesem Einzelschrittbefehl anzugeben? Ich möchte es mit meinen CA-Dateien unterschreiben. Jeremy Baker vor 9 Jahren 0
@JeremyBaker: Nein, dafür brauchst du einen zweistufigen Prozess. Lassen Sie "-x509" und "-days" aus, um eine CSR anstelle eines Zertifikats zu generieren, und verwenden Sie dann Ihre übliche CA-Signaturmethode. bahamat vor 9 Jahren 1
Das ist nicht ganz richtig: `-subj" /C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com "" Sie können den Servernamen nicht [richtig] über den Befehl einstellen Linie. Um den Servernamen unter * Subject Alternate Name * zu platzieren, müssen Sie eine OpenSSL-Konfigurationsdatei verwenden. Andernfalls wird der Servername unter * Common Name * abgelegt, und das Zertifikat wird unter Browsern nicht überprüft. jww vor 7 Jahren 0
@jww SAN ist nicht erforderlich. Browser werden das Thema CN gut überprüfen. * Alternativer Betreffname *, wie der Name andeutet, ist ein * alternativer Name * für das * Betrefffeld *. bahamat vor 7 Jahren 0
@ bahamat - Zitieren bitte. Hier ist das Dokument, aus dem hervorgeht, dass das SAN erforderlich ist: [Baseline-Anforderungen des CA / Browser-Forums] (https://cabforum.org/baseline-requirements-documents/); Abschnitt 7.4. das gleiche Dokument sagt uns, dass der CN veraltet ist, aber (noch) nicht verboten ist. jww vor 7 Jahren 0
@jww - und diese Zeit ist gekommen. Wenn Sie mit Chrome v58 beginnen, eine sichere Seite zu laden, das Zertifikat jedoch keinen übereinstimmenden subjectAltName enthält, wird eine Datenschutzfehlerseite mit der Fehlernachricht "NET :: ERR_CERT_COMMON_NAME_INVALID" angezeigt. Durch Klicken auf die Schaltfläche "Erweitert" wird die Meldung "... angezeigt, dass das Sicherheitszertifikat von [missing_subjectAltName] stammt". Insomniac Software vor 7 Jahren 1
8
9000

Macht die -passinOption nicht den Trick für Sie?

Mit file:pathnameform können Sie mit den Berechtigungen 600 für diese Datei ziemlich sicher sein.

Sah die Option in der Manpage. Sieht aus, als könnte ich die Passphrase auf diese Weise ohne Aufforderung verwenden. Vielen Dank! vor 13 Jahren 0
Und mit "-passin" pass: YOUR_PASSWORD ""? - doc: https://www.openssl.org/docs/man1.0.2/apps/openssl.html#PASS-PHRASE-ARGUMENTS andras.tim vor 6 Jahren 0
3
Andrei Sura

Die akzeptierte Antwort erfordert einige kleine Korrekturen. EG-Zeilen:

-newkey ec -pkeyopt ec_paramgen_curve:prime256v1 

sollte sein:

 -newkey ec \ -pkeyopt ec_paramgen_curve:prime256v1 \ 

Unter MacOS - OpenSSL 1.0.2f, das über Brew installiert wurde, überprüfte ich die akzeptierte Antwort wie unten beschrieben

  • Um verfügbare elliptische Kurven aufzulisten:

    $ openssl ecparam -list_curves 
  • So generieren Sie eine Schlüsseldatei:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem 
  • So erstellen Sie das Zertifikat ohne Kennwortaufforderung:

    openssl req \ -new \ -newkey ec:secp256k1.pem \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \ -keyout server.key \ -out server.crt 
  • So zeigen Sie das Zertifikat an:

    $ openssl x509 -noout -text -in server.crt 
Wie unterscheidet sich das von der akzeptierten Antwort? Ramhound vor 8 Jahren 0
Der einzige wichtige Unterschied ist, dass ich den Schritt der Generierung der Pem-Datei explizit aufliste. Bei der akzeptierten Antwort fehlen die beiden \ Zeichen und ich bin der Meinung, dass der Befehl falsch ist. Andrei Sura vor 8 Jahren 1
Vielleicht möchten Sie diese Tatsache erwähnen. Wenn die akzeptierte Antwort tatsächlich unvollständig ist und Zeichen fehlen, ist es wichtig, die Unterschiede hervorzuheben und wie Ihre Antwort wichtige wichtige Informationen enthält. Ramhound vor 8 Jahren 0
1
jxmallett

@bahamat hat eine großartige Antwort. Leider geben einige Versionen von openssl einen Fehler aus, wenn Sie versuchen, ein ECDSA-Zertifikat mit einem Befehl zu erstellen. Der Fehler lautet ungefähr so:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404 

Ich habe openssl 1.0.1e-fipsam verwendet CentOS 7.

Das Erstellen Ihres Zertifikats mit den folgenden 3 Befehlen scheint zu funktionieren:

openssl ecparam -genkey -name prime256v1 -out key.pem openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem 
Sollte die letzte Zeile nicht mit "server.crt" enden? ᴠɪɴᴄᴇɴᴛ vor 7 Jahren 0
0
kenorb

Versuchen Sie den folgenden Befehl:

openssl genrsa -des3 -out user.key -passout pass:foo 1024 

Das Überspringen Teil ist: -passout pass:foo.