Crear certificado autofirmado SSL/TLS (OpenSSL)

TEORÍA

¿Qué es un certificado SSL/TLS?

PRÁCTICA

Hay varias herramientas para trabajar con certificados SSL/TLS. En este caso vamos a usar OpenSSL ya que es el más abierto y por ende con mayor comunidad.

Vamos a suponer que tenemos un dominio llamado «SSLland.com.local» al que queremos añadir comunicación segura (este dominio va a ser un Virtual Host que funcionando bajo el servidor Apache proporcionado por XAMPP).

Si usas Windows, generar un certificado OpenSSL autofirmado no es posible con las herramientas «built-in» del SO (esto es más propio de distribuciones de UNIX). Podéis descargar una implementación de OpenSSL para Windows AQUÍ, pero la elección de qué implementación usar es vuestra.

Los pasos a seguir serían los siguientes:

1.- Crear una clave privada y el documento CSR

2.- Crear el certificado SSL autofirmado a partir del CSR y la clave privada creados.

Crear una clave privada y el documento CSR

Tras ejecutar en la consola de comandos el archivo openssl.exe, escribimos las siguientes líneas (durante la ejecución preguntará por los datos del CSR antes mencionados):

[msdos]
req \
-newkey rsa:2048 -nodes -keyout domain.key \
-out domain.csr \
-sha256
[/msdos]

  • newkey rsa:2048 indica que queremos que la clave se genere usando el algoritmo RSA con 2048 bits.
  • nodes indica que no queremos que la clave privada sea encriptada con una contraseña.
  • keyout es la ruta + nombre del archivo donde queremos que se escriba la clave.
  • out es la ruta + nombre del archivo donde queremos que se escriba el documento CSR.
  • sha256 es el algoritmo hash que queremos usar para generar la huella digital (si la CA a la que queramos enviar el CSR no soporta sha256 sencillamente eliminar esta línea).

Crear el certificado SSL autofirmado a partir del CSR y la clave privada creados

[msdos]
x509 \
-signkey domain.key \
-in domain.csr \
-req -days 365 -out domain.crt
[/msdos]

  • x509 indica que queremos crear un certificado autofirmado.
  • signkey indica el path + nombre del fichero donde se halla la clave privada.
  • in indica el path + nombre del fichero donde se halla el archivo CSR.
  • days indica el número de días durante los cuales es útil (válido) el certificado. Cuando pasen estos días, el navegador (o la aplicación que usemos para realizar la conexión segura) nos indicará que el certificado ya ha expirado. Tengamos en cuenta que el algoritmo de comunicación por Diffi-Hellman se basa en el problema de calcular la inversa del logaritmo en módulo N que aún no ha sido resuelto matemáticamente hablando, solo puede ser deducido mediante fuerza bruta. Dependiendo de la capacidad de computación actual y el número de bits usado en la clave privada, un usuario malicioso puede tardar más o menos tiempo en deducir la clave privada a partir de la clave pública. Para ello ponemos un límite en el cual suponemos que un usuario malicioso podría haber «roto» la clave y en ese momento el certificado SSL ya no sería seguro.

Otros comandos útiles

Crear el CSR usando una clave privada existente:

[msdos]
openssl req \
-key domain.key \
-new -out domain.csr
[/msdos]

Crear el certificado SSL auto-firmado (te pregunta los datos de empresa de CSR).

[msdos]
openssl req \
-key domain.key \
-new \
-x509 -days 365 -out domain.crt
[/msdos]

Ver el contenido de un CSR

[msdos]
openssl req -text -noout -verify -in domain.csr
[/msdos]

Podéis ver más comandos útiles de OpenSSL en la siguiente dirección: https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs

Implantar el certificado en Apache

En ESTA ENTRADA puedes ver el proceso. Simplemente sustituid el dominio «midominio.com» por «SSLLand.com.local«.

Añadir el certificado a la lista de confianza

Cada navegador tiene su pequeña base de datos interna de certificados en los que confía, así que confiar en un certificado en un navegador (incluso desde las opciones de internet del SO) no provocará que el certificado sea confiable para todos los navegadores.

Obviamente, si el certificado lo hemos obtenido de una CA confiable, no es necesario este paso.

IE/Edge

Aunque no es muy popular, Internet Explorer es una buena alternativa para utilizar aplicaciones web de caracter corporativo interno, ya que permite elegir los niveles de seguridad que queremos aplicar, ejecutar scripts en la parte cliente mediante ActiveX, abrir archivos del equipo cliente, etc (cosas que en el internet «del exterior» son graves problemas de seguridad, pero que en un sistema cerrado y controlado no).

Para incluir un certificado de confianza a la lista, hacer doble click en el certificado (archivo con extensión crt, si tiene extensión cert se puede cambiar la extensión a crt sin problemas) y se mostrarán los detalles del certificado, indicando que este certificado aún no está instalado.

Pulsar en «Instalar certificado…»

Y cuando nos pregunte en qué almacén de certificados debe guardarse, elegir «Entidades de certificación raíz de confianza».

Si quisiéramos buscar este certificado (para borrar, ver sus detalles, etc), se haría desde el panel de control, opciones de internet y ahí abrir la pestaña «Contenido»; y dentro de dicha pestaña pulsar en el botón «Certificados»:

Opciones de Internet -> Contenido -> Certificados

Aquí están todos los certificados que maneja Windows. Nuestro certificado debería estar en las pestaña de «Entidades de certificación intermedias».

 

Firefox, Chrome, etc.

Sencillamente hay que añadir el certificado a la lista de excepciones:


Créditos de fuentes externas:

Referencias:

  • https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs
  • https://support.rackspace.com/how-to/generate-a-csr-with-openssl/

Deja una respuesta