¿Cómo generar una clave openSSL usando una frase de contraseña desde la línea de comando?

107

Primero, ¿qué pasa si no doy una contraseña? ¿Se utiliza algún tipo de frase pseudoaleatoria? Solo estoy buscando algo "lo suficientemente bueno" para mantener a raya a los piratas informáticos ocasionales.

En segundo lugar, ¿cómo genero un par de claves desde la línea de comando, proporcionando la frase de contraseña en la línea de comando?


Finalmente lo hice funcionar usando estos comandos, usando exec () que generalmente se considera que no es seguro de usar, siendo mejor dar la PassPhrase en un archivo. Puedo aceptar este riesgo porque estoy seguro de que PHP solo se ejecutará en mi PC (que ejecuta Windows y no tiene 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

Muchas, muchas gracias a @caf, sin el cual esto no hubiera sido posible.

Solo un lamento: no importa cuánto openssl_pkey_new()busque en Google, parece que nadie puede empezar a trabajar con Xampp en Windows (que es la forma correcta de generar un par de claves)

Mawg dice reinstalar a Monica
fuente
4
¿Por qué es openssl_pkey_new()... la forma "adecuada" de generar un par de claves?
Jake Berger
Windows no lo tiene (normalmente) pspero desde Vista sí lo tienewmic process get commandline
dave_thompson_085

Respuestas:

210

Si no usa una frase de contraseña, entonces la clave privada no está encriptada con ningún cifrado simétrico, se genera completamente desprotegida.

Puede generar un par de claves, proporcionando la contraseña en la línea de comandos utilizando una invocación como (en este caso, la contraseña es foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

Sin embargo, tenga en cuenta que esta frase de contraseña podría ser capturada por cualquier otro proceso que se esté ejecutando en la máquina en ese momento, ya que los argumentos de la línea de comandos generalmente son visibles para todos los procesos.

Una mejor alternativa es escribir la frase de contraseña en un archivo temporal que esté protegido con permisos de archivo y especificar que:

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

O proporcione la frase de contraseña en la entrada estándar:

openssl genrsa -aes128 -passout stdin 3072

También puede utilizar una canalización con nombre con la file:opción o un descriptor de archivo.


Para luego obtener la clave pública coincidente, debe usar openssl rsa, proporcionando la misma frase de contraseña con el -passinparámetro que se usó para cifrar la clave privada:

openssl rsa -passin file:passphrase.txt -pubout

(Esto espera la clave privada cifrada en la entrada estándar; en su lugar, puede leerla desde un archivo usando -in <file>).


Ejemplo de creación de un par de claves pública y privada de 3072 bits en archivos, con el par de claves privadas cifradas con contraseña foobar:

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub
coste y flete
fuente
+1 ¡Genial, eso funciona! Gracias, si puedes ayudar un poquito más, obtendrás la respuesta ... ¿por qué no funciona? openssl rsa -in privkey.pem -pubout -passout pass: foobar -out pubkey.pem
Mawg dice reinstalar a Monica
o, para decirlo de otra manera, cómo obtener la clave pública de su comando (que difería ligeramente del mío). Solo necesito un par combinado. Esto es solo una seguridad "lo suficientemente buena".
Mawg dice reinstalar a Monica el
4
@Mawg: Su opensslcomando genera la clave pública correspondiente a la clave privada proporcionada; las claves públicas no están encriptadas (no son secretas), por lo que su uso -passoutno tiene sentido. Probablemente desee utilizar -passinallí para proporcionar la frase de contraseña que se utilizó para cifrar la clave privada en el primer paso. También agregué algo a la respuesta.
caf
@caf, gracias por los excelentes comentarios (+1 nuevamente). Sin embargo, aparentemente soy demasiado tonto para que me permitan usar OpenSSL. Quiero la clave en un archivo y, por alguna razón, openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pemno lo hago. ¿Puede darme dos comandos: uno para generar la clave privada en un archivo y un segundo para generar la clave pública (también en un archivo)? Lamento ser una molestia, pero he estado jugando con eso y no puedo hacer que funcione :-(
Mawg dice reinstalar a Monica
3
@Mawg: A OpenSSL no le gusta si el -outparámetro viene después de 2048, en realidad, se supone que eso es lo último en la línea de comando (he actualizado mi respuesta como tal). Mira el último ejemplo, creo que eso es lo que quieres. En cuanto a AES-128, alguien en quien confío en estos asuntos lo recomienda sobre AES-256.
Café
9

genrsaha sido reemplazado porgenpkey & cuando se ejecuta manualmente en un terminal, solicitará una contraseña:

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

Sin embargo, cuando se ejecuta desde un script, el comando no pedirá una contraseña, por lo que para evitar que la contraseña sea visible como un proceso, utilice una función en un 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
fuente