Wie generiere ich einen openSSL-Schlüssel mit einer Passphrase über die Kommandozeile?

107

Erstens - was passiert, wenn ich keine Passphrase gebe? Wird eine Art Pseudozufalls-Phrase verwendet? Ich bin nur auf der Suche nach etwas "Gut genug", um gelegentliche Hacker in Schach zu halten.

Zweitens: Wie generiere ich ein Schlüsselpaar aus der Befehlszeile und gebe die Passphrase in der Befehlszeile ein?


Ich habe es endlich mit diesen Befehlen zum Laufen gebracht, mit exec (), dessen Verwendung im Allgemeinen als nicht sicher angesehen wird, da es besser ist, die PassPhrase in einer Datei anzugeben. Ich kann dieses Risiko akzeptieren, da ich sicher bin, dass PHP immer nur auf meinem PC ausgeführt wird (auf dem Windows ausgeführt wird und kein PS-Befehl vorhanden ist).

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 2048
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

Vielen vielen Dank an @caf, ohne den dies nicht möglich gewesen wäre.

Nur ein Bedauern - egal wie viel ich google, niemand kann scheinen, openssl_pkey_new()mit Xampp unter Windows zu arbeiten (was der richtige Weg ist, um ein Schlüsselpaar zu generieren)

Mawg sagt, Monica wieder einzusetzen
quelle
4
Warum ist openssl_pkey_new()... der "richtige" Weg, um ein Schlüsselpaar zu generieren?
Jake Berger
Windows hat (normalerweise) nicht, psaber seit Vista hat eswmic process get commandline
dave_thompson_085

Antworten:

210

Wenn Sie keine Passphrase verwenden, wird der private Schlüssel nicht mit einer symmetrischen Verschlüsselung verschlüsselt - er wird völlig ungeschützt ausgegeben.

Sie können ein Schlüsselpaar generieren, indem Sie das Kennwort in der Befehlszeile mithilfe eines Aufrufs wie (in diesem Fall lautet das Kennwort foobar) eingeben :

openssl genrsa -aes128 -passout pass:foobar 3072

Beachten Sie jedoch, dass diese Passphrase von jedem anderen Prozess erfasst werden kann, der zu diesem Zeitpunkt auf dem Computer ausgeführt wird, da Befehlszeilenargumente im Allgemeinen für alle Prozesse sichtbar sind.

Eine bessere Alternative besteht darin, die Passphrase in eine temporäre Datei zu schreiben, die mit Dateiberechtigungen geschützt ist, und Folgendes anzugeben:

openssl genrsa -aes128 -passout file:passphrase.txt 3072

Oder geben Sie die Passphrase bei der Standardeingabe ein:

openssl genrsa -aes128 -passout stdin 3072

Sie können auch eine Named Pipe mit der file:Option oder einen Dateideskriptor verwenden.


Um dann den passenden öffentlichen Schlüssel zu erhalten, müssen Sie openssl rsadieselbe Passphrase mit dem -passinParameter angeben, der zum Verschlüsseln des privaten Schlüssels verwendet wurde:

openssl rsa -passin file:passphrase.txt -pubout

(Dies erwartet den verschlüsselten privaten Schlüssel bei der Standardeingabe - Sie können ihn stattdessen mit aus einer Datei lesen -in <file>.)


Beispiel für die Erstellung eines 3072-Bit-Paares aus privatem und öffentlichem Schlüssel in Dateien, wobei das private Schlüsselpaar mit einem Kennwort verschlüsselt ist foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub
caf
quelle
+1 Großartig, das funktioniert! Danke, wenn du nur ein bisschen mehr helfen kannst, bekommst du die Antwort ... warum funktioniert das nicht? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg sagt, Monica
oder anders ausgedrückt: wie man den öffentlichen Schlüssel von Ihrem Befehl (der sich geringfügig von meinem unterscheidet). Ich brauche nur ein passendes Paar. Dies ist nur "gerade gut genug" Sicherheit.
Mawg sagt, Monica
4
@Mawg: Ihr opensslBefehl gibt den öffentlichen Schlüssel aus, der dem angegebenen privaten Schlüssel entspricht. Öffentliche Schlüssel sind nicht verschlüsselt (sie sind nicht geheim), daher -passoutmacht die Verwendung keinen Sinn. Sie möchten -passindort wahrscheinlich die Passphrase angeben, mit der der private Schlüssel im ersten Schritt verschlüsselt wurde. Ich habe der Antwort auch etwas hinzugefügt.
Café
@caf, danke für das tolle Feedback (wieder +1). Ich bin jedoch anscheinend zu dumm, um OpenSSL verwenden zu dürfen. Ich möchte den Schlüssel in einer Datei und openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemmache das aus irgendeinem Grund nicht. Können Sie mir bitte zwei Befehle geben - einen zum Generieren des privaten Schlüssels in eine Datei und einen zweiten zum Generieren des öffentlichen Schlüssels (auch in einer Datei)? Es tut
mir
3
@Mawg: OpenSSL mag es nicht, wenn der -outParameter nach dem kommt 2048- wirklich, das sollte das Letzte in der Befehlszeile sein (ich habe meine Antwort als solche aktualisiert). Siehe das letzte Beispiel, ich denke, das ist was du willst. AES-128 wird von jemandem, dem ich vertraue , gegenüber AES-256 empfohlen.
Café
9

genrsawurde durchgenpkey & ersetzt, wenn es manuell in einem Terminal ausgeführt wird, werden Sie zur Eingabe eines Kennworts aufgefordert:

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096

Wenn der Befehl jedoch über ein Skript ausgeführt wird, werden Sie nicht nach einem Kennwort gefragt. Um zu vermeiden, dass das Kennwort als Prozess angezeigt werden kann, verwenden Sie eine Funktion in einem shellSkript:

get_passwd() {
    local passwd=
    echo -ne "Enter passwd for private key: ? "; read -s passwd
    openssl genpkey -aes-256-cbc -pass pass:$passwd -algorithm RSA -out $PRIV_KEY -pkeyopt rsa_keygen_bits:$PRIV_KEYSIZE
}
Stuart Cardall
quelle