Generación de certificados SSL autofirmados con OpenSSL

La implementación de una Infraestructura de Clave Pública (PKI) interna comienza con la configuración de una Entidad Certificadora (CA) propia. OpenSSL permite gestionar este proceso de forma manual o automatizada mediante scripts.

Configuración manual de una Entidad Certificadora (CA)

Antes de generar certificados, es necesario definir la estructura de archivos que OpenSSL utiliza para rastrear las versiones y firmas. Por defecto, en sistemas Linux, esta configuración se encuentra en /etc/pki/tls/openssl.cnf.

1. Preparación del entorno de la CA

Debe crear los directorios necesarios para almacenar claves privadas, certificados emitidos y la base de datos de firmas:

mkdir -p /etc/pki/CA/{certs,crl,newcerts,private}
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial

2. Creación de la clave privada y el certificado raíz

Genere una clave RSA de 4096 bits para la CA con permisos restringidos:

(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

Posteriormente, genere el certificado raíz (Self-signed Root CA):

openssl req -new -x509 \
    -key /etc/pki/CA/private/cakey.pem \
    -out /etc/pki/CA/cacert.pem \
    -days 3650 \
    -subj "/C=ES/ST=Madrid/L=Madrid/O=Sistemas/OU=IT/CN=MiCA_Interna"

Emisión de certificados para servicios

Para securizar un servicio (como Apache o Nginx), se requiere generar una clave privada para dicho servicio y una solicitud de firma de certificado (CSR).

1. Generación de clave y CSR

openssl genrsa -out servidor.key 4096
openssl req -new -key servidor.key -out servidor.csr \
    -subj "/C=ES/ST=Madrid/O=Sistemas/CN=web.empresa.local"

2. Firma del certificado por la CA

En el servidor que actúa como CA, ejecute el siguiente comando para validar la solicitud y emitir el certificado final:

openssl ca -in servidor.csr -out /etc/pki/CA/certs/servidor.crt -days 365

Automatización mediante Script para Certificados Wildcard

En entornos de desarrollo, suele ser más eficiente utilizar un script que genere automáticamente un certificado comodín (*.dominio.com) incluyendo las extensiones Subject Alternative Name (SAN).

#!/bin/bash
# generador_cert.sh

set -e

FQDN_BASE="$1"
TEMP_DIR=$(mktemp -d)

if [ -z "$FQDN_BASE" ]; then
    echo "Uso: $0 dominio.com"
    exit 1
fi

# Asegurar archivo de entropía
[ -f $HOME/.rnd ] || dd if=/dev/urandom of=$HOME/.rnd bs=256 count=1

# 1. Crear CA temporal
openssl genrsa -out $TEMP_DIR/root.key 4096
openssl req -x509 -new -nodes -sha256 -days 3650 \
    -subj "/C=ES/ST=Madrid/L=Madrid/O=DevOps/CN=$FQDN_BASE Root CA" \
    -key $TEMP_DIR/root.key \
    -out $TEMP_DIR/root.crt

# 2. Clave del servidor y CSR
openssl genrsa -out $TEMP_DIR/web.key 4096
openssl req -new -sha256 \
    -subj "/C=ES/ST=Madrid/O=Sistemas/CN=*.$FQDN_BASE" \
    -key $TEMP_DIR/web.key \
    -out $TEMP_DIR/web.csr

# 3. Extensiones V3 (SAN)
cat > $TEMP_DIR/ext_v3.cnf <<eof .="" authoritykeyidentifier="keyid,issuer" basicconstraints="CA:FALSE" certificado="" cp="" dataencipherment="" dns.1="$FQDN_BASE" dns.2="*.$FQDN_BASE" echo="" en="" eof="" exportar="" extendedkeyusage="serverAuth" firmar="" generados="" keyencipherment="" keyusage="digitalSignature," mkdir="" nonrepudiation="" openssl="" resultados="" subjectaltname="@alt_names" x509=""></eof>

Gestión de la Revocación

Si una clave se ve comprometida, debe revocarse para que los clientes dejen de confiar en ella. Este proceso actualiza la lista de revocación de certificados (CRL):

# Revocar un certificado específico
openssl ca -revoke /etc/pki/CA/newcerts/01.pem

# Inicializar número de CRL si es la primera vez
echo 01 > /etc/pki/CA/crlnumber

# Generar el archivo CRL
openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl

Para verificar el contenido del certificado generado y asegurar que los campos DNS alternativos son correctos, utilice:

openssl x509 -in web.crt -text -noout

Etiquetas: OpenSSL SSL/TLS PKI seguridad bash

Publicado el 8-13 00:18