OpenSSL – certificados digitales

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.


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í.