En esta entrada se explicarán los comandos básicos para la generación de certificados digitales con OpenSSL, tanto para comunicaciones digitales como para servicios.
Hay que tener en cuenta que un certificado está compuesto por una llave privada (.key), el certificado final (.crt o .pem o .pk12, …) y a veces son requeridos los certificados raíz e intermedio de la entidad certificadora (CA), que son públicos en la mayoría de las ocasiones pudiendo ser descargados desde la web de la entidad. Para la solicitud del certificado se genera un archivo de petición (.csr), que solo será necesario para la solicitud del certificado final.
Con todo esto dicho, vamos al lío y veamos los comandos habituales para la administración de certificados con OpenSSL.
Tabla de contenidos
Comandos de generación
Certificado autofirmado
Este tipo de certificados no tiene coste alguno y serán completamente válidos para levantar un servicio SSL/TLS en la máquina, pero por contra no serán válidos para los navegadores Web al no estar firmados por una entidad o autoridad certificadora (CA) pudiendo esto también afectar a una aplicación que requiera un CA válido para levantar una comunicación. Si aún así te es válido este tipo de certificados, aquí te muestro el comando necesario. En este caso no se solicita una contraseña para proteger el certificado.
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout llavePrivada.key -out certificado.crt
Es necesario tener en cuenta que este comando genera un certificado que usa una función de encriptación de tipo SHA1 y este está descatalogado en la mayoría de entidades de certificación, los cuales lo tienen fuera de catálogo, y además no está permitido por el Centro Criptológico Nacional en su documento oficial con los requisitos para la obtención del Esquema Nacional de Seguridad (ENS), ver el siguiente enlace con esta información pinchando aquí.
Para generar el certificado autofirmado con una función de las permitidas por el CCN-CERT debemos de indicar el parámetro -sha256:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout llavePrivada.key -out certificado.crt
Esto nos genera dos archivos, la semilla (.key) y el certificado final (.crt), indicados en el comando anterior.
certificado.crt llavePrivada.key
En el siguiente enlace se puede consultar como configurar un certificado autofirmado en Apache, pinchando aquí
Solicitud de certificado
El siguiente comando genera la llave privada (.key) y la solicitud del certificado (.csr) para enviar a la entidad certificadora (CA). En este caso se solicita una contraseña opcional para proteger el certificado, pero si se indica alguna afectará al reinicio del servidor web, ya que te va a solicitar una por cada certificado que tenga configurado con contraseña, afectando al inicio del servicio.
openssl req -out tiraquelibras.csr -new -newkey rsa:2048 -nodes -keyout tiraquelibras.key
Esto genera dos archivos, uno con la llave privad (.key) y otro con la solicitud (.csr).
tiraquelibras.csr tiraquelibras.key
Revocar la contraseña del certificado
Si hemos especificado una contraseña a la hora de generar la petición del certificado podemos eliminarla con el siguiente comando.
openssl rsa -in tiraquelibras.key -out tiraquelibras.key
Generar una solicitud sobre una llave privada existente
Podemos generar una solicitud de certificado a partir de una llave privada existente con el siguiente comando.
openssl req -out CSR.csr -key tiraquelibras.key -new
Esto solo genera un archivo nuevo con la solicitud (.csr), ya que mantiene la llave privada existente (.key).
Generar una solicitud sobre un certificado existente
Podemos generar una solicitud sobre un certificado ya existente (.crt) con su llave privada (.key), lo cual obtendrá los datos indicados para la generación del certificado anterior y no pedirá ningún dato adicional para el nuevo.
openssl x509 -x509toreq -in tiraquelibras.crt -out CSR.csr -signkey tiraquelibras.key
Este comando solo generará un nuevo archivo con la solicitud (.csr).
Comandos de verificación
Verificar una solicitud (.csr)
Para verificar los datos de una solicitud (.csr) usaremos el siguiente comando.
openssl req -text -noout -verify -in CSR.csr
Verificar una llave privada (.key)
Para verificar los datos de una llave privada (.key) usaremos el siguiente comando.
openssl rsa -in tiraquelibras.key -check
Verificar un certificado (.crt)
Para verificar un certificado (.crt) usaremos el siguiente comando.
openssl x509 -in tiraquelibras.crt -text -noout
Verificar un certificado (.cer)
Nos valdría con el comando que verifica el formato .crt pero en ocasiones debemos de indicar el formado de codificación durante la llamada.
Comando sin indicar el formado:
openssl x509 -in tiraquelibras.cer -text -noout
Formato pem:
openssl x509 -inform pem -in tiraquelibras.cer -text -noout
Formato der:
openssl x509 -inform der -in tiraquelibras.cer -text -noout
Usamos un comando u otro en función del si se muestra un error o no tras ser ejecutado.
Verificar un certificado en formato PKCS#12 file (.pfx or .p12)
Si tenemos un certificado en formato pfx o p12 usaremos el siguiente comando.
openssl pkcs12 -info -in keyStore.p12
Depurando con OpenSSL
Compatibilidad entre llave privada (.key), certificado (.crt) y solicitud (.csr)
Con el comando md5 de OpenSSL podemos confirmar la compatibilidad entre los tres archivos usados para la creación del certificado, teniendo que dar como resultado el mismo valor.
openssl rsa -noout -modulos -in tiraquelibras.key | openssl md5 rsa: Unknown cipher modulos rsa: Use -help for summary. (stdin)= d41d8cd98f00b204e9800998ecf8427e openssl req -noout -modulos -in CSR2.csr | openssl md5 req: Unknown digest modulos req: Use -help for summary. (stdin)= d41d8cd98f00b204e9800998ecf8427e
Verificación de host remoto
Con el comando s_client de OpenSSL podemos consultar de forma remota el estado de un certificado aplicado a un host o URL concreto. Este comando admite multitud de opciones, pero solo voy a mostrar un par de casos concretos.
Comando básico:
openssl s_client -showcerts -connect tiraquelibras.com:443
Consultar solo fecha de inicio y fin:
echo | openssl s_client -connect tiraquelibras.com:443 2>/dev/null | openssl x509 -noout -dates notBefore=Aug 3 00:00:00 2017 GMT notAfter=Aug 3 23:59:59 2018 GMT
En Google hay multitud de enlaces para consultar las opciones del comando openssl s_client.
Conversión a otros formatos
De archivo DER (.crt .cer .der) a PEM
openssl x509 -inform der -in tiraquelibras.cer -out tiraquelibras.pem
De archivo PEM a DER
openssl x509 -outform der -in tiraquelibras.pem -out tiraquelibras.der
De archivo PKCS#12 file (.pfx .p12) conteniendo una llave privada y un certificado a PEM
openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes
De archivo PEM y llave privada a PKCS#12 (.pfx .p12)
openssl pkcs12 -export -out tiraquelibras.pfx -inkey tiraquelibras.key -in tiraquelibras.crt -certfile CACert.crt
Conclusión
Con estos comandos tenemos más que suficiente para poder trabajar con nuestros certificados SSL. Espero que sean de utilidad para todo el mundo que haya leído esta entrada del blog.
Enlaces de interés
Algunos enlaces de interés sobre estos comandos:
Comandos más habituales pincha aquí.
Comandos más habituales 2 pincha aquí.