Certificado auto-firmado

Crea e importa tu propio certificado SSL

Roberto Lodeiro

Son muchos los escenarios en los que podemos necesitar un certificado auto-firmado. Desde probar una app que estemos desarrollando hasta servir de forma segura nuestros propios servicios en nuestra red doméstica.

Si te interesa generar tus propios certificados auto-firmados en linux, este post es para ti!


Preparación

Primero vamos a instalar los paquetes necesarios. Como siempre yo utilizo Debian, pero servirá para cualquier derivado como Ubuntu o similares.

  • Actualizamos e instalamos los paquetes necesarios:
$ sudo apt update
$ sudo apt install openssl ca-certificates
  • Creamos una carpeta para trabajar en ella, la cual contendrá nuestros certificados:
$ mkdir certificados
$ cd certificados

1. Crear llave privada de la CA

  • Creamos la llave privada de nuestra CA:
$ openssl genrsa -des3 -out CAPrivate.key 2048

Nos pedirá una contraseña para asignar a nuestra clave privada, la cual necesitaremos mas tarde, apuntala!

2. Generar el certificado root de la CA

  • Generamos el certificado root de nuestra CA:
$ openssl req -x509 -new -nodes -key CAPrivate.key -sha256 -days 365 -out CAPrivate.pem

Nos pedirá la contraseña de nuestra llave privada del paso anterior. Tras introducirla nos pedirá los siguientes datos:

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Los vamos rellenando y pulsando enter. Al finalizar el certificado root quedará generado.

3. Crear llave privada

  • Creamos la nueva llave privada:
$ openssl genrsa -out MyPrivate.key 2048

4. Generar CSR

  • Generamos el CSR:
$ openssl req -new -key MyPrivate.key -extensions v3_ca -out MyRequest.csr

Se nos pedirán los siguientes datos, los extra podemos dejarlos en blanco:

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:s
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

5. Crear fichero configuración

Ahora, crearemos el fichero de configuración para nuestro certificado:

$ nano myconfig.cnf
  • Pegamos el siguiente contenido, modificando nuestro dominio local:
basicConstraints = CA:FALSE
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1 = midominio.lan
DNS.2 = *.midominio.lan

Esto hará que nuestro certificado sirva tanto para nuestro dominio, como para cualquier subdominio del mismo.

6. Generar el certificado

  • Generamos nuestro certificado:
$ openssl x509 -req -in MyRequest.csr -CA CAPrivate.pem -CAkey CAPrivate.key -CAcreateserial -extfile myconfig.cnf -out MyCert.crt -days 365 -sha256

Se nos pedirá nuevamente la contraseña que pusimos a la key de nuestra CA, tras introducirla el certificado quedará generado.


Añadir certificado en Nginx

Si vamos a servir nuestros propios servicios en nuestra red local, es muy común utilizar Nginx como reverse proxy. Utilizaremos MyCert.crt y MyPrivate.key.

  • Configuración de ejemplo en Nginx:
server {

listen 80;
server_name midominio.lan;
# enforce https
return 301 https://$host$request_uri;
}
server {
server_name midominio.lan;

listen 443 ssl;

ssl_certificate /ruta/certificados/MyCert.crt;
ssl_certificate_key /ruta/certificados/MyPrivate.key;

Aquí se muestra una configuración simple, donde se fuerza el tráfico por https y se indica el certificado a utilizar. Debemos dar la ruta absoluta al certificado y a la key.

Importar certificado

Para que nuestra máquina confíe en el certificado que hemos creado, necesitamos importarlo a nivel de sistema. Para ello vamos a utilizar CAPrivate.pem.

Es importante recalcar que necesitamos renombrarlo con la extensión crt.

  • Copiamos el certificado a la siguiente ruta:
$ sudo cp CAPrivate.pem /usr/local/share/ca-certificates/CAPrivate.crt
  • Ejecutamos el siguiente comando:
$ sudo dpkg-reconfigure ca-certificates

Con esto nuestro sistema confiará en nuestro nuevo certificado. Si necesitamos importarlo en Firefox u otro navegador, así como iOS o Android, usaremos también CAPrivate.pem.

Por último, indicar que he utilizado una duración de 365 días para nuestro certificado, ya que si ponemos una duración mayor de 398 días este no funcionará en nuestros dispositivos de Apple por una restricción de seguridad.


Espero que sea útil, ¡gracias por leerme!