OpenSSL es la implementación de referencia (toolkit + librería libssl/libcrypto) de los protocolos TLS/SSL y de las primitivas criptográficas (cifrado simétrico, asimétrico, hashing, gestión de certificados X.509). Es el motor criptográfico subyacente de Nginx, Apache, HAProxy, OpenVPN, Postfix y la práctica totalidad de servicios TLS en Linux.
Estándares y RFCs aplicables:
RFC 5280 — Perfil de certificados y CRL X.509 v3 (estructura, extensiones, validación de cadena).
RFC 8446 — TLS 1.3 (handshake simplificado, eliminación de cifrados inseguros por diseño).
RFC 6960 — OCSP (Online Certificate Status Protocol).
RFC 2986 (PKCS#10) — Formato de las Certificate Signing Requests (CSR).
Vector de funcionamiento resumido: OpenSSL opera en dos roles diferenciados — como Autoridad de Certificación (openssl ca, openssl req -x509) para emitir y gestionar certificados, y como motor TLS de librería (libssl) consumido por servicios de terceros para establecer canales cifrados en tiempo real.
⚙️ Ficheros de Configuración y Rutas Clave
Ruta
Descripción
/etc/ssl/openssl.cnf
Configuración global del sistema OpenSSL (políticas por defecto, MinProtocol, CipherString).
/etc/ssl/certs/
Almacén de certificados de CA confiables del sistema (formato PEM, gestionado por update-ca-certificates).
/etc/ssl/private/
Ubicación estándar (root-only, chmod 700) para claves privadas de servicios del sistema.
/usr/lib/ssl/certs/ca-certificates.crt
Bundle consolidado de CAs raíz públicas de confianza del SO.
/opt/ca/<nombre-ca>/openssl-*.cnf
Configuraciones personalizadas de CA (root/intermedia) definidas por el administrador.
/opt/ca/<nombre-ca>/index.txt
Base de datos plana de certificados emitidos/revocados (formato OpenSSL ca).
/opt/ca/<nombre-ca>/serial
Contador del próximo número de serie a emitir.
/opt/ca/<nombre-ca>/crlnumber
Contador de versión de la CRL.
/etc/update-ca-certificates.d/
Certificados adicionales a incorporar al almacén de confianza del sistema tras update-ca-certificates.
🛠️ Comandos de Administración / Cheat Sheet CLI
Generación de claves y CSR
1 2 3 4 5 6 7 8 9101112
# Clave privada RSA moderna (mínimo recomendado 3072 bits, CCN-STIC 807)
opensslgenpkey-algorithmRSA-pkeyoptrsa_keygen_bits:3072-outclave.key.pem
# Clave privada ECDSA (más eficiente, equivalente en seguridad, preferida para TLS de alto rendimiento)
opensslgenpkey-algorithmEC-pkeyoptec_paramgen_curve:P-256-outclave-ec.key.pem
# Generar un CSR a partir de una clave existente
opensslreq-new-keyclave.key.pem-outsolicitud.csr.pem\-subj"/C=ES/ST=Sevilla/O=ASIR-CORP/CN=host.dominio.local"# Certificado autofirmado rápido (solo para laboratorio/desarrollo, nunca producción)
opensslreq-x509-newkeyrsa:3072-keyoutdev.key.pem-outdev.cert.pem-days365-nodes
Inspección y verificación de certificados
1 2 3 4 5 6 7 8 9101112131415161718
# Ver el contenido completo de un certificado
opensslx509-incert.pem-noout-text
# Ver solo fechas de validez
opensslx509-incert.pem-noout-dates
# Ver huella digital (fingerprint) SHA-256
opensslx509-incert.pem-noout-fingerprint-sha256
# Verificar que una clave privada corresponde a un certificado (deben coincidir los módulos)
opensslx509-noout-modulus-incert.pem|opensslsha256
opensslrsa-noout-modulus-inclave.key.pem|opensslsha256
# Verificar la cadena de confianza completa contra la CA
opensslverify-CAfileca-chain.cert.pemcert.pem
# Comprobar un CSR antes de enviarlo a firmar
opensslreq-text-noout-verify-insolicitud.csr.pem
Diagnóstico de conexiones TLS remotas
1 2 3 4 5 6 7 8 91011
# Conectar a un servicio TLS remoto y mostrar el certificado presentado
openssls_client-connecthost.dominio.local:443-servernamehost.dominio.local
# Forzar una versión específica de protocolo (para pruebas de downgrade)
openssls_client-connecthost.dominio.local:443-tls1_2
# Comprobar el estado OCSP en vivo (stapling)
openssls_client-connecthost.dominio.local:443-status
# Listar los cifrados soportados por la librería instalada
opensslciphers-v'DEFAULT@SECLEVEL=2'
Empaquetado y conversión de formatos
12345678
# Convertir PEM a PKCS#12 (para importar en clientes Windows/navegadores)
opensslpkcs12-export-outbundle.p12-inkeyclave.key.pem-incert.pem-certfileca-chain.cert.pem
# Convertir DER a PEM
opensslx509-informder-incert.der-outcert.pem
# Extraer clave pública de una clave privada
opensslrsa-inclave.key.pem-pubout-outclave.pub.pem
🛡️ Bastionado y Hardening (CCN-CERT / CIS)
Forzar SECLEVEL=2 como mínimo en /etc/ssl/openssl.cnf (CipherString = DEFAULT@SECLEVEL=2), lo que descarta automáticamente claves RSA < 2048 bits, DSA y cifrados de 112 bits o inferiores.
Prohibir TLS 1.0/1.1 a nivel de sistema con MinProtocol = TLSv1.2 en la sección [system_default_sect]; esto afecta a todo servicio que use la librería del sistema sin configuración explícita propia.
Permisos de clave privada: siempre chmod 400 y propietario exclusivo del servicio (chown www-data:www-data en el caso de Nginx), nunca legible por grupo ni otros. Verificar con CIS Benchmark control de "Ensure permissions on private key files are configured".
No almacenar claves privadas sin cifrar en repositorios de configuración gestionada (Ansible/Puppet); usar Vault (ver UD12) o ansible-vault como mínimo.
Rotación forzosa de certificados de hoja a 90-398 días máximo, alineado con CA/Browser Forum, incluso en PKI interna, para limitar la ventana de exposición ante robo de clave.
Auditar aleatoriedad del sistema (/dev/urandom) en máquinas virtuales recién clonadas antes de generar claves de CA, para evitar el problema documentado de reutilización de entropía en clonado de imágenes.
🩺 Diagnóstico, Logs y Escalado
Síntoma
Comando de diagnóstico
Causa habitual
certificate has expired
openssl x509 -enddate -noout -in cert.pem
Certificado de hoja o de CA caducado; revisar automatización de renovación.
unable to get local issuer certificate
openssl verify -CAfile ca-chain.cert.pem cert.pem
Falta el certificado intermedio en la cadena servida por el servicio (bundle incompleto).
Handshake TLS falla con cifrado weak
nmap --script ssl-enum-ciphers -p 443 host
Configuración ssl_ciphers/CipherString demasiado permisiva en el servicio.
key values mismatch al desplegar
Comparar módulos con openssl x509 -noout -modulus vs openssl rsa -noout -modulus
Se ha desplegado una clave privada que no corresponde al certificado emitido.
Certificado revocado o responder OCSP inaccesible; escalar a SecOps si es inesperado.
Escalado: cualquier hallazgo de una clave privada de CA (root o intermedia) fuera de su ubicación de custodia, o un acceso no auditado a /opt/ca/*/private/, debe escalarse inmediatamente como incidente de seguridad crítico (P1) conforme al procedimiento de respuesta a incidentes de UD8, dado que compromete la cadena de confianza de toda la organización.