Evite la solicitud de contraseña para las claves y las solicitudes de información de DN

90

Estoy usando el siguiente código para generar claves:

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

Tengo dos preguntas:

  1. ¿Cómo puedo omitir la solicitud de frase de contraseña? ¿Sería razonablemente seguro para mí hacerlo? (ya que no debería ser completamente tonto como cualquiera debería ser capaz de hackear el certificado)

  2. ¿Cómo evito la solicitud del nombre del país, la organización, etc.? Espero poder darles el símbolo del sistema (la página del manual muestra solo las opciones de nivel superior para OpenSSL)

jww
fuente

Respuestas:

150

Editar: esta es, con mucho, mi respuesta más popular, y han pasado algunos años, así que he agregado una variante ECDSA. Si puede usar ECDSA, debería hacerlo.


Puede proporcionar toda esa información en la línea de comando.

Generación de un certificado autofirmado sin contraseña de un paso:

Versión RSA

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

Versión ECDSA

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

Todos los subcomandos openssl tienen su propia página de manual. Ver man req.


Abordar específicamente sus preguntas y ser más explícito sobre exactamente qué opciones están vigentes:

  1. La -nodesbandera indica que no se debe cifrar la clave, por lo que no necesita una contraseña. También puedes usar la -passout argbandera. Consulte PASS PHRASE ARGUMENTSen la openssl(1)página del manual cómo formatear el argumento.

  2. Usando la -subjbandera puede especificar el tema (el ejemplo está arriba).

bahamat
fuente
3
Leer cosas a través de "-subj" funciona muy bien, sin embargo, para mí, solo cuando OPENSSL_CONF NO está configurado. IOW: si OPENSSL_CONF está configurado, OpenSSL intentará leer desde allí e ignorará el argumento de la línea de comandos "-subj". Me tomó un tiempo darme cuenta.
oberstet
oberstet: Sí, eso es cierto.
bahamat
¿Es posible pasar la clave de asunto en sí desde stdin? He intentado "-key stdin", "-key fd: 1" y "-key -" .. sin suerte.
oberstet
1
@JeremyBaker: No, necesitarás un proceso de dos pasos para eso. Omita -x509y -dayspara generar una CSR en lugar de un certificado, luego use su método habitual de firma de CA.
bahamat
1
@jww - y ha llegado ese momento. Comenzando con Chrome v58, cuando intenta cargar una página segura pero el certificado no contiene un subjectAltName coincidente, muestra una página de error de privacidad con el mensaje de error "NET :: ERR_CERT_COMMON_NAME_INVALID". Al hacer clic en el botón avanzado, aparece el mensaje "... su certificado de seguridad es de [missing_subjectAltName]"
Insomniac Software
11

¿La -passinopción no te sirve?

Con el file:pathnameformulario puede estar bastante seguro con los permisos 600 para ese archivo.

9000
fuente
Vio la opción en la página del manual. Parece que puedo tener la frase de contraseña de esa manera sin preguntar. ¡Gracias!
Y con -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/…
andras.tim
5

La respuesta aceptada necesita un par de pequeñas correcciones. Líneas CE:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

debiera ser:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

En MacOS - OpenSSL 1.0.2f instalado a través de brew, verifiqué la respuesta aceptada como se describe a continuación

  • Para enumerar las curvas elípticas disponibles:

    $ openssl ecparam -list_curves
    
  • Para generar un archivo de clave:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Para generar el certificado sin solicitud de contraseña:

    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
    
  • Para ver el certificado:

    $ openssl x509 -noout -text -in server.crt
    
Andrei Sura
fuente
¿Cómo es esto diferente de la respuesta aceptada?
Ramhound
1
La única diferencia importante es que enumero explícitamente el paso de generar el archivo pem. A la respuesta aceptada le faltan los dos caracteres \ y me hizo pensar que el comando es incorrecto.
Andrei Sura
1
Es posible que desee mencionar ese hecho. Si la respuesta aceptada es realmente incompleta y le faltan caracteres, es importante resaltar las diferencias y cómo su respuesta contiene información importante importante.
Ramhound
3

Pruebe el siguiente comando:

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

La parte de saltar es: -passout pass:foo.

kenorb
fuente
2

@bahamat tiene una gran respuesta. Desafortunadamente, algunas versiones de openssl arrojan un error al intentar crear un certificado ECDSA con un comando. El error es algo como:

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

Estaba usando openssl 1.0.1e-fipsen CentOS 7.

Crear su certificado con los siguientes 3 comandos parece funcionar:

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
fuente
¿No debería terminar la última línea server.crt?
ᴠɪɴᴄᴇɴᴛ