Cómo crear mis propios certificados SSL

Muy a menudo necesitamos certificados SSL para nuestros servicios. Es verdad que desde hace un tiempo tenemos disponible Let’s Encrypt que nos permite generarlos y mantenerlos de una manera fácil, cómoda y además son gratuitos.

En el caso que necesitemos generar nuestros propios certificados aquí va una guía de cómo hacerlo. Hoy crearemos una Autoridad de Certificación propia -CA en inglés- y a partir podremos generar nuestros propios certificados. A este tipo de certificados se les llama autofirmados o self-signed en inglés.

Aunque pueda parecer una cosa extraña esto de generarse sus propios certificados, éstos nos pueden ser muy útiles en casos cómo :

  • Test de servicios en local.
  • Cuando no disponemos de acceso a internet o éste es limitado.
  • Para tener el control de a quien se asignan los certificados.
  • Para servicios que no podemos estar parando cada año para actualizarle el certificado.

Si bien estos certificados que vamos a generar nos van a cifrar las conexiones extremo a extremo, no es recomendable su uso en servicios públicos dónde sea necesaria la validación de la identidad ya que nadie puede dar fe de nuestra identidad.

Prerrequisitos

Necesitaremos tener instalado el paquete openssl para poder crerar nuestros certificados. Para hacerlo ejecutaremos en nuestra consola de Ubuntu :

sudo apt install openssl

Generación de la Autoridad de Certificación (CA)

El primer paso para crear el certificado de la CA es generar un clave privada de tipos RSA y de 4096 bits. Nuestra clave privada se almacenará en el archivo rootCA.key. Y lo haremos usando ejecutando :

openssl genrsa -out rootCA.key 4096 

Una vez tenemos la clave ya podremos generar el certificado de nuestra propia autoridad de certificación y que firmaremos con la clave que acabamos de generar. En nuestro caso obtendremos el certificado en el archivo rootCA.crt. Los parámetros destacados son :

  • -key : Nombre de archivo de la clave privada que hemos generado en el paso anterior
  • -days : Caducidad del certificado. Podemos indicar el valor que queramos.
  • -out : Archivo de salida del certificado.
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.crt

Una vez ejecutado el comando nos pedirá una serie de información que debemos completar o simplemente ir confirmando los valores por defecto que nos va proporcionando.

Guardaremos estos archivos ya que los necesitaremos cada vez que debamos emitir un certificado SSL.

Generación del certificado SSL para el servicio o servidor

Al igual que con la CA lo primero que tendremos que hacer es crear una clave privada. Ejecutaremos el siguiente comando indicando cual será el archivo donde se almacenará la clave privada. En nuestro caso server.key :

openssl genrsa -out server.key 4096

A continuación generaremos un archivo de solicitud de firma electrónica, CSR. Este archivo contendrá entre otras cosas, la clave pública que se usará en la posterior firma del certificado. Los parámetros que pasaremos serán :

  • -key : La clave privada del servidor que acabamos de generar.
  • -out : El archivo de salida que contiene la petición CSR.

En la generación del CSR nos va a pedir los datos que se van a incluir en este certificado. Ejecutamos :

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

A diferencia de los datos que nos piden en la generación de la CA, aquí hay un valor que tenemos que indicar si queremos usar el certificado en un servidor o servicio y es el FQDN, o sea, el nombre del servidor o dominio.

Además se nos pedirá una contraseña para proteger el certificado posterior. En nuestro caso no hemos indicado ninguno.

Finalmente para generar el certificado propiamente necesitaremos pasar los siguientes parámetros :

  • -in : Archivo que contiene el CSR.
  • -CA : Certificado de la CA.
  • -CAkey : Archivo de la clave privada de la CA.
  • -out : Archivo de salida del servidor.
  • -days : Duración del certificado en días.

Ejecutaremos :

openssl x509 -req -in server.csr -CA rootCA.crt \
-CAkey rootCA.key -CAcreateserial \
-days 500 -out servidor.crt  

Ahora ya disponemos de los archivos necesarios para poder configurar la capa de cifrado SSL/TLS a nuestros servicios. Los archivos que vamos a tener que usar principalmente para cargar en los servicios van a ser :

  • El certificado de la CA. En nuestro caso rootCA.crt.
  • La clave privada del servidor o servicio. En este ejemplo es server.key.
  • El certificado del servidor o servicio. En el presente documento es server.crt.

Puede que el servicio necesite el certificado en un único archivo con extensión .pem que unifique los certificados de CA, servidor y la clave privada. Para generarlo nada más hemos de concatenar estos archivos en un orden concreto : primero el certificado del servidor, a continuación la clave privada y finalmente el certificado de la CA (o cadena de CAs si las hubiese aunque no sea nuestro caso). Para hacerlo ejecutaríamos :

cat server.crt >> fullCert.pem
cat server.key >> fullCert.pem
cat rootCA.pem >> fullCert.pem 

Deja un comentario