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

90

Ich benutze folgenden Code, um Schlüssel zu generieren:

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 Passwortabfrage überspringen? Wäre es einigermaßen sicher für mich, dies zu tun? (wie in sollte es nicht geradezu töricht sein, wie jemand in der Lage sein sollte, das Zertifikat zu hacken)

  2. Wie vermeide ich die Aufforderung zur Eingabe des Ländernamens, der Organisation usw. Ich hoffe, ich kann sie über die Eingabeaufforderung eingeben (auf der Manpage werden nur Optionen der obersten Ebene für OpenSSL angezeigt)

jww
quelle

Antworten:

150

Bearbeiten: Dies ist bei weitem meine beliebteste Antwort, und es ist nun ein paar Jahre her, so dass ich eine ECDSA-Variante hinzugefügt habe. Wenn Sie ECDSA verwenden können, sollten Sie.


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

Selbstsignierte, kennwortlose Zertifikatserstellung 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 Unterbefehle von openssl haben eine eigene Manpage. Sehen man req.


Speziell auf Ihre Fragen eingehen und genauer wissen, welche Optionen wirksam sind:

  1. Das -nodesFlag signalisiert, dass der Schlüssel nicht verschlüsselt werden soll, sodass Sie kein Passwort benötigen. Sie könnten auch die -passout argFlagge verwenden. Siehe PASS PHRASE ARGUMENTSin der openssl(1)man - Seite , wie Sie die arg zu formatieren.

  2. Mit der -subjFlagge können Sie den Betreff festlegen (Beispiel siehe oben).

Bahamat
quelle
3
Das Lesen von Inhalten über "-subj" funktioniert jedoch - für mich - nur dann hervorragend, wenn OPENSSL_CONF NICHT gesetzt ist. IOW: Wenn OPENSSL_CONF gesetzt ist, versucht OpenSSL, von dort aus zu lesen und ignoriert das Befehlszeilenargument "-subj". Ich habe eine Weile gebraucht, um es herauszufinden.
Oberstet
oberstet: Ja, das stimmt.
Bahamat
Ist es möglich, den Betreffschlüssel selbst von stdin zu übergeben? Ich habe versucht "-key stdin", "-key fd: 1" und "-key -" .. ohne Glück.
Oberstet
1
@ JeremyBaker: Nein, dafür brauchst du einen zweistufigen Prozess. Lassen Sie das -x509und weg -days, um eine CSR anstelle eines Zertifikats zu generieren, und verwenden Sie dann Ihre gewohnte CA-Signaturmethode.
Bahamat
1
@jww - und diese Zeit ist gekommen. Ab Chrome v58 wird beim Versuch, eine sichere Seite zu laden, das Zertifikat jedoch keinen passenden subjectAltName enthält, eine Datenschutzfehlerseite mit der Fehlermeldung "NET :: ERR_CERT_COMMON_NAME_INVALID" angezeigt. Wenn Sie auf die Schaltfläche "Erweitert" klicken, wird die Meldung "... das Sicherheitszertifikat stammt von [missing_subjectAltName]" angezeigt
Insomniac Software
11

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

Mit file:pathnameFormular können Sie mit Berechtigungen 600 für diese Datei ganz sicher sein.

9000
quelle
Säge die Option in der Manpage. Es sieht so aus, als könnte ich die Passphrase auf diese Weise ohne Aufforderung erhalten. Vielen Dank!
Und mit -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/…
andras.tim
5

Die akzeptierte Antwort benötigt ein paar kleine Korrekturen. EG-Linien:

-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, habe ich die akzeptierte Antwort wie unten beschrieben überprüft

  • So listen Sie verfügbare elliptische Kurven auf:

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

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

    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
    
Andrei Sura
quelle
Wie unterscheidet sich das von der akzeptierten Antwort?
Ramhound
1
Der einzige wichtige Unterschied ist, dass ich den Schritt zum Generieren der PEM-Datei explizit aufführe. Bei der akzeptierten Antwort fehlen die beiden \ -Zeichen, und ich habe den Eindruck, dass der Befehl falsch ist.
Andrei Sura
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 anzugeben, wie Ihre Antwort wichtige wichtige Informationen enthält.
Ramhound
3

Versuchen Sie den folgenden Befehl:

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

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

Kenorb
quelle
2

@ Bahamat hat eine tolle Antwort. Leider werfen einige Versionen von openssl einen Fehler auf, wenn versucht wird, ein ECDSA-Zertifikat mit einem Befehl zu erstellen. Der Fehler geht ungefähr so:

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

Ich habe openssl 1.0.1e-fipsauf 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
jxmallett
quelle
Sollte die letzte Zeile nicht mit enden server.crt?
8.