Generar certificados con OpenSSL

Categories:

Habrá ocasiones en que necesitemos generar certificados para utilizar o para configurar servicios antes de comprar un certificado. Antes de comenzar a generar los archivos menciono los tipos de certificados con los que me ha tocado trabajar para después generarlos y por último implementarlos.

Extensión / Extensiones

Descripción

csr

Es una petición para firma de certificado.
Puede incluir parte o todos los detalles del certificado solicitado como organización, estado, nombre así como la llave pública del certificado para ser firmada.
Estos son firmados por la CA – Certificate Authority / Autoridad certificadora – y devuelven un certificado.
El archivo devuelto es un certificado público, el cual puede ser utilizado en distintos formatos.

pem

Es un formato “contenedor” que puede incluir únicamente el certificado público, o la cadena completa del certificado que incluye la llave pública, llave privada y certificado raíz.

key

Es un archivo PEM que contiene únicamente la llave privada de un certificado en particular y es un nombre convencional no un estándar.

cert, cer, crt

Un archivo PEM que tiene una extensión de archivo distinta. Esta extensión es reconocida por Windows Explorer como certificado – Windows no reconoce pem como certificado -.

Las descripciones anteriores son traducción de parte de la primer respuesta – y algunos comentarios sobre la misma – de – ¿Qué es una archivo PEM y cómo difiere de otros formatos de archivo de llaves generados con OpenSSL? /
What is a Pem file and how does it differ from other OpenSSL Generated Key File Formats? -. El contenido completo está en serverfault.

Generar certificados

Para generar los certificados primero revisamos si está instalado openssl.
Si está instalado revisamos la versión.

$ which openssl 
#  /usr/bin/openssl

$ openssl version
# OpenSSL 0.9.8za 5 Jun 2014

Ya que sabemos que OpenSSL está instalado generamos una carpeta de trabajo para generar los archivos.

$ mkdir certs
$ cd certs

key

Podemos generar una llave privada de dos maneras.

La primer versión incluye una frase de contraseña – passphrase – que se tiene que utilizar cada vez que se utilice la llave. Es más segura pero puede resultar poco práctica si se utiliza como parte de cifrado de datos se algún servicio – servidor web – ya que se tiene que utilizar la frase cada que se inicia el servicio.

La segunda versión no incluye la frase de contraseña y, aunque es menos segura, puede resultar más práctica para utilizar en servicios automatizados.

# Esta versión va  a solicitar
# una frase de contraseña  - passphrase - 
# al momento de generar la llave.

$ openssl genrsa -des3 -out server.key 1024

# Esta versión genera la llave 
# sin necesidad de establecer 
# una frase de contraseña 

$ openssl genrsa -out server.key 1024

También es posible que, al tener una llave con frase de contraseña, eliminemos la frase de la llave.

$ cp server.key server.key.tmp
$ openssl rsa -in server.key.tmp -out server.key
$ rm server.key.tmp

csr

Una vez que tenemos la llave privada vamos a crear una petición de firma de certificado – CSR Certificate Signing Request.

# Al generar la petición de firma del certificado
# se nos preguntan datos como país, estado / provincia
# localidad, nombre de la organización, correo, etc.
# En caso de no querer contestar o para dejar "en blanco"
# la respuesta hay que utilizar un punto - . - como respuesta.

# Si el certificado utiliza frase de contraseña se va a solicitar
# al momento de introducir el comando

$ openssl req -new -key server.key -out server.csr

crt

Con la llave privada y la petición de firma generamos el certificado.

# En este caso se utiliza el archivo csr para obtener 
# algunos datos como país, estado, provincia, etc.

$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

pem

Para generar el archivo PEM se van a utilizar los datos que están en el archivo server.csr

También es posible generar el archivo PEM sin necesidad de tener el archivo csr o key.
Al momento de generarlo se crea la llave privada y ésta se integra dentro del archivo.

# Generar el archivo PEM con los datos que están
# en el archivo server.csr
$ openssl x509 -inform DER -outform PEM -in server.csr -out server.pem

# Generar el archivo PEM con clave privada 
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout server.pem -out server.pem

Si al momento de generar el archivo PEM se muestran errores y contienen lo siguiente:

$ 0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
$ 0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

Es probable que el archivo está en formato PEM. Se puede cambiar la extensión por pem o crear una copia con la extensión pem si es que se va a utilizar el archivo csr. – Vía stackoverflow.

certs.sh

Es un script que hice para automatizar la generación de los certificados * para está en github y en bitbucket.

* Utiliza los comandos utilizados aquí.
Genera la llave sin frase de contraseña – passphrase -.

Utilizar

Esta es una referencia general de dónde pueden ser utilizados los certificados.

En este caso estoy utilizando ubuntu server y las aplicaciones que van a utilizar los certificados son nginx, dovecot, postfix y webmin.

En nginx se utiliza la llave y el certificado dentro del bloque server.

# Parte del archivo /etc/nginx/sites-available/sitio
server {
 listen 443 ssl;
 ssl_certificate /etc/certs/server.crt;
 ssl_certificate_key /etc/certs/server.key;
}

En dovecot se utiliza la llave y el certificado en el archivo dovecot.conf

# Parte del archivo /etc/dovecot/dovecot.conf
ssl_cert = </etc/certs/dovecot.crt
ssl_key = </etc/certs/dovecot.key

En postfix se utiliza la llave, el certificado y el archivo pem en el archivo main.cf

# Parte del archivo /etc/postfix/main.cf
smtpd_use_tls=yes
smtpd_tls_cert_file=/etc/certs/smtpd.crt
smtpd_tls_key_file=/etc/certs/smtpd.key
smtpd_tls_CAfile = /etc/certs/cacert.pem

En webmin se utiliza el archivo pem como llave y certificado en el archivo webmin.conf – Es posible utilizar una llave y un certificado independientes como en los ejemplos anteriores.

# Parte del archivo /etc/webmin/ miniserv.conf
keyfile=/etc/certs/server.pem

Advertencia

En los casos anteriores, como no hay una autoridad certificadora – CA – que valide la autenticidad de los certificados, lo más probable es que las aplicaciones que utilicemos – clientes de correo o navegadores – nos muestren una advertencia.

Advertencia Safari
Advertencia Safari
Advertencia Chrome
Advertencia Chrome
Advertencia Firefox
Advertencia Firefox
Advertencia de seguridad en Apple Mail
Advertencia de seguridad en Apple Mail

Dependiendo de los servicios y el alcance podemos utilizar los certificados generados o, una vez configurados los servicios, comprar un certificado y utilizar ese certificado con la configuración definida.