jedg_logo

Crear certificados SSL con OpenSSL y autoridad propia

Generar un certificado SSL propio con OpenSSL permite tener cifrado seguro en un servidor, sin depender de una autoridad externa. Esto es útil para entornos de desarrollo internos, redes privadas o cuando se desea control total sobre la infraestructura de certificados. El primer paso consiste en crear la clave privada de la autoridad certificadora. Esta clave es el elemento central de la seguridad y debe ser protegida de manera estricta. La generamos usando OpenSSL con cifrado AES-256 y un tamaño de 4096 bits. Esto garantiza que nadie pueda acceder a la clave fácilmente y permite firmar certificados confiables. La clave se guarda en un archivo llamado 'ca-key.pem'.

openssl genrsa -aes256 -out ca-key.pem 4096

Crear el certificado público de la CA

Una vez generada la clave privada de la CA, se crea el certificado público de la CA. Este certificado es autofirmado y contiene la información que identificará a nuestra autoridad certificadora, incluyendo datos como el nombre, organización y período de validez de 10 años. Se utiliza para firmar cualquier certificado que emitamos posteriormente y se distribuye a los clientes que deben confiar en los certificados de nuestra CA.

openssl req -new -x509 -sha256 -days 3650 -key ca-key.pem -out ca.pem

Generar la clave privada del servidor

Con la CA lista, se procede a crear la clave privada del servidor. Esta clave se utilizará en el servidor para cifrar las conexiones TLS. Es importante que esta clave permanezca segura y no sea compartida.

openssl genrsa -out cert-key.pem 4096

Crear la CSR del servidor

Con la clave privada generada, creamos una solicitud de firma de certificado (CSR). Esta solicitud contiene los datos del servidor como el nombre común 'CN' y se guarda en 'cert.csr'. La CSR será firmada por nuestra CA para generar un certificado válido. La inclusión de Subject Alternative Name (SAN) es esencial porque los navegadores modernos ignoran el CN si no existe SAN. Este archivo define los nombres de dominio y direcciones IP que estarán permitidos en el certificado, por ejemplo 'DNS:*.midominio.com' y 'IP:1.1.1.1'.

openssl req -new -sha256 -subj "/CN=jedg" -key cert-key.pem -out cert.csr
echo "subjectAltName=DNS:*.midominio.com,IP:1.1.1.1" >> extfile.cnf

Firmar la CSR con la CA

Este paso produce el certificado final 'cert.pem', que el servidor usará para establecer conexiones HTTPS seguras. El proceso utiliza la clave privada de la CA y el certificado 'ca.pem' como base para firmar la CSR y aplicar las extensiones definidas en 'extfile.cnf'. El certificado resultante tendrá la misma validez de 10 años que la CA y se le asigna un número de serie único.

openssl x509 -req -sha256 -days 3650 -in cert.csr -CA ca.pem -CAkey ca-key.pem -out cert.pem -extfile extfile.cnf -CAcreateserial

Crear la cadena completa (fullchain)

Para que los servidores y clientes puedan verificar correctamente la cadena de confianza, se crea un archivo 'fullchain.pem' que concatena primero el certificado del servidor y después el certificado de la CA. Este archivo es especialmente útil en servidores web y clientes TLS que requieren conocer la cadena completa de certificación.

cat cert.pem > fullchain.pem
cat ca.pem >> ./fullchain.pem

Verificar el certificado

Es recomendable comprobar que todo está correcto. Se puede inspeccionar el certificado y su firma con OpenSSL, revisando fechas, SAN y firmante. Además, se puede validar frente a la CA instalada.

openssl x509 -in cert.pem -noout -text
openssl verify -CAfile ca.pem cert.pem

Instalar la CA raíz en distintos sistemas

En Windows, se puede usar PowerShell con 'Import-Certificate' en el almacén de Root.

Import-Certificate -FilePath "C:\ruta\ca.pem" -CertStoreLocation Cert:\LocalMachine\Root

En Linux (Debian/Ubuntu) se copia el certificado a los directorios de confianza del sistema y se actualizan las autoridades.

sudo cp ca.pem /usr/local/share/ca-certificates/jedg-root.crt
sudo update-ca-certificates

En Linux (RHEL/CentOS/Fedora) se hace similar usando update-ca-trust.

sudo cp ca.pem /etc/pki/ca-trust/source/anchors/jedg-root.pem
sudo update-ca-trust extract

En macOS se agrega al llavero del sistema usando security add-trusted-cert.

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /ruta/ca.pem

En Firefox se importa con certutil.

certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "JEDG Root CA" -i ca.pem

En Android o iOS se hace a través de Ajustes de seguridad, instalando el certificado y activando la confianza manualmente.

Uso en servidores web

Este certificado puede ser usado en servidores como nginx, incluyendo 'fullchain.pem' y 'cert-key.pem' en la configuración SSL. Esto garantiza que todas las conexiones hacia el servidor estén cifradas, y que los clientes puedan verificar la identidad del servidor usando la CA instalada previamente. JEDG ha desarrollado una herramienta que automatiza todos estos pasos y facilita la creación de certificados con autoridad propia cert.jedgig.com, lo que permite generar la CA, los certificados del servidor y la cadena completa de manera sencilla.

Autor de la documentación: jedg & Inteligencia Artificial