Come generare una chiave openSSL utilizzando una passphrase dalla riga di comando?


107

Primo: cosa succede se non fornisco una passphrase? Viene usata una sorta di frase pseudo casuale? Sto solo cercando qualcosa di "abbastanza buono" per tenere a bada gli hacker occasionali.

Secondo: come faccio a generare una coppia di chiavi dalla riga di comando, fornendo la passphrase sulla riga di comando?


Alla fine l'ho fatto funzionare usando questi comandi, usando exec () che generalmente è ritenuto non sicuro da usare, essendo meglio dare la PassPhrase in un file. Posso accettare questo rischio poiché sono sicuro che PHP verrà eseguito solo sul mio PC (che esegue Windows e non ha un comando PS).

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

Mille grazie a @caf, senza il quale questo non sarebbe stato possibile.

Solo un rimpianto: che, non importa quanto io sia su Google, sembra che nessuno riesca a openssl_pkey_new()lavorare con Xampp su Windows (che è il modo corretto per generare una coppia di chiavi)


4
perché openssl_pkey_new()... il modo "corretto" per generare una coppia di chiavi?
Jake Berger

Windows (normalmente) non ce l'ha, psma da Vista hawmic process get commandline
dave_thompson_085 il

Risposte:


210

Se non si utilizza una passphrase, la chiave privata non viene crittografata con alcun cifrario simmetrico: viene emessa completamente non protetta.

È possibile generare una coppia di chiavi, fornendo la password sulla riga di comando utilizzando una chiamata come (in questo caso, la password è foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Tuttavia, si noti che questa passphrase potrebbe essere acquisita da qualsiasi altro processo in esecuzione sulla macchina in quel momento, poiché gli argomenti della riga di comando sono generalmente visibili a tutti i processi.

Un'alternativa migliore è scrivere la passphrase in un file temporaneo protetto con i permessi del file e specificare che:

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

Oppure fornisci la passphrase sullo standard input:

openssl genrsa -aes128 -passout stdin 3072

È inoltre possibile utilizzare una named pipe con l' file:opzione o un descrittore di file.


Per ottenere quindi la chiave pubblica corrispondente, è necessario utilizzare openssl rsa, fornendo la stessa passphrase con il -passinparametro utilizzata per crittografare la chiave privata:

openssl rsa -passin file:passphrase.txt -pubout

(Questo si aspetta la chiave privata crittografata sull'input standard: puoi invece leggerla da un file usando -in <file>).


Esempio di creazione di una coppia di chiavi privata e pubblica a 3072 bit nei file, con la coppia di chiavi private crittografata con password foobar:

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

+1 Fantastico, funziona! Grazie, se puoi aiutare un po 'di più l'adolescente, ti viene assegnata la risposta ... perché non funzionerà? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg dice reinstate Monica

o, per dirla in un altro modo, come utilizzare la chiave pubblica dal tuo comando (che differiva leggermente dal mio). Ho solo bisogno di una coppia abbinata. Questa è solo una sicurezza "appena sufficiente".
Mawg dice di reintegrare Monica il

4
@Mawg: il tuo opensslcomando sta emettendo la chiave pubblica corrispondente alla chiave privata fornita - le chiavi pubbliche non sono crittografate (non sono segrete), quindi l'uso -passoutnon ha senso. Probabilmente vorrai usarlo -passinlì, per fornire la passphrase che è stata utilizzata per crittografare la chiave privata nel primo passaggio. Ho anche aggiunto qualcosa alla risposta.
caf

@caf, grazie per l'ottimo feedback (+1 di nuovo). Tuttavia, a quanto pare sono troppo stupido per poter usare OpenSSL. Voglio la chiave in un file e, per qualche motivo, openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemnon lo faccio. Puoi darmi due comandi: uno per generare la chiave privata in un file e un secondo per generare la chiave pubblica (anche in un file)? Mi dispiace essere un tale fastidio, ma ci ho giocato e non riesco proprio a farlo funzionare :-(
Mawg dice reintegrare Monica

3
@Mawg: a OpenSSL non piace se il -outparametro viene dopo 2048- davvero, dovrebbe essere l'ultima cosa sulla riga di comando (ho aggiornato la mia risposta come tale). Guarda l'ultimo esempio, penso che sia quello che vuoi. Per quanto riguarda AES-128, qualcuno di cui mi fido in queste questioni lo consiglia su AES-256.
caf

9

genrsaè stato sostituito dagenpkey e quando viene eseguito manualmente in un terminale richiederà una password:

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

Tuttavia, quando viene eseguito da uno script, il comando non chiederà una password, quindi per evitare che la password sia visualizzabile come processo, utilizzare una funzione in uno shellscript:

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.