Como gerar uma chave openSSL usando uma frase-senha da linha de comando?

107

Primeiro - o que acontece se eu não fornecer uma senha longa? É usado algum tipo de frase pseudoaleatória? Estou apenas procurando algo "bom o suficiente" para manter os hackers casuais afastados.

Segundo - como faço para gerar um par de chaves da linha de comando, fornecendo a frase secreta na linha de comando?


Eu finalmente consegui fazer funcionar usando esses comandos, usando exec () que geralmente é considerado não seguro para usar, sendo melhor fornecer a senha em um arquivo. Posso aceitar o risco, pois tenho certeza de que o PHP só será executado no meu PC (que roda o Windows e não tem um comando PS).

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

Muito obrigado a @caf, sem o qual isso não teria sido possível.

Apenas um arrependimento - que, não importa o quanto eu pesquise no Google, ninguém consegue openssl_pkey_new()trabalhar com o Xampp no ​​Windows (que é a maneira correta de gerar um par de chaves)

Mawg diz reintegrar Monica
fonte
4
por que é openssl_pkey_new()... a maneira "adequada" de gerar um par de chaves?
Jake Berger
O Windows (normalmente) não tem, psmas desde o Vista temwmic process get commandline
dave_thompson_085

Respostas:

210

Se você não usar uma frase secreta, a chave privada não será criptografada com nenhuma cifra simétrica - ela será gerada totalmente desprotegida.

Você pode gerar um par de chaves, fornecendo a senha na linha de comando usando uma invocação como (neste caso, a senha é foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

No entanto, observe que essa frase secreta pode ser capturada por qualquer outro processo em execução na máquina no momento, uma vez que os argumentos da linha de comando geralmente são visíveis para todos os processos.

A melhor alternativa é escrever a frase secreta em um arquivo temporário protegido com permissões de arquivo e especificar:

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

Ou forneça a senha na entrada padrão:

openssl genrsa -aes128 -passout stdin 3072

Você também pode usar um canal nomeado com a file:opção ou um descritor de arquivo.


Para obter a chave pública correspondente, você precisa usar openssl rsa, fornecendo a mesma senha longa com o -passinparâmetro que foi usado para criptografar a chave privada:

openssl rsa -passin file:passphrase.txt -pubout

(Isso espera a chave privada criptografada na entrada padrão - você pode, em vez disso, lê-la de um arquivo usando -in <file>).


Exemplo de criação de um par de chaves pública e privada de 3072 bits em arquivos, com o par de chaves privadas criptografado com senha foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub
caf
fonte
+1 Ótimo, isso funciona! Obrigado, se você puder ajudar um pouco mais, então você receberá a resposta ... por que isso não funciona? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg diz para restabelecer Monica em
ou, dito de outra forma - como a chave pública do seu comando (que diferia um pouco do meu). Eu só preciso de um par compatível. Isso é apenas uma segurança "boa o suficiente".
Mawg diz para restabelecer Monica em
4
@Mawg: Seu opensslcomando está emitindo a chave pública correspondente à chave privada fornecida - as chaves públicas não são criptografadas (não são secretas), portanto, -passoutnão faz sentido usar . Você provavelmente deseja usar -passinlá, para fornecer a frase secreta que foi usada para criptografar a chave privada na primeira etapa. Também acrescentei algo à resposta.
caf
@caf, obrigado pelo ótimo feedback (+1 novamente). No entanto, aparentemente sou muito burro para usar o OpenSSL. Quero a chave em um arquivo e, por algum motivo, openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemnão faço isso. Você pode me dar dois comandos - um para gerar a chave privada em um arquivo e um segundo para gerar a chave pública (também em um arquivo)? Desculpe ser um incômodo, mas estou brincando com isso e simplesmente não consigo fazer funcionar :-(
Mawg diz reintegrar Monica em
3
@Mawg: OpenSSL não gosta se o -outparâmetro vier depois de 2048- realmente, essa é a última coisa na linha de comando (atualizei minha resposta como tal). Veja o último exemplo, acho que é isso que você quer. Quanto ao AES-128, alguém em quem confio nesses assuntos o recomenda em vez do AES-256.
caf
9

genrsafoi substituído porgenpkey & quando executado manualmente em um terminal, ele solicitará uma senha:

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

No entanto, quando executado a partir de um script, o comando não pedirá uma senha, para evitar que a senha seja visualizada como um processo, use uma função em um 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
}
Stuart Cardall
fonte