OpenSSL es la navaja suiza para certificados SSL/TLS. Todos los demás artículos de este sitio hacen referencia a comandos OpenSSL; esta página los reúne todos en un solo lugar.
Verificar un certificado
Ver detalles del certificado (servidor remoto)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text
Verificar fecha de vencimiento
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
Verificar subject y SANs
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName
Verificar emisor (qué CA)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer
Verificar un archivo de certificado local
openssl x509 -in cert.pem -noout -text
openssl x509 -in cert.pem -noout -dates # Just the dates
openssl x509 -in cert.pem -noout -subject # Just the subject
openssl x509 -in cert.pem -noout -ext subjectAltName # Just the SANs
Verificar la cadena de certificados
Verificar completitud de la cadena (remoto)
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null
# Look for:
# Verify return code: 0 (ok) ← Chain is complete
# Verify return code: 21 (unable to verify) ← Chain is incomplete
Verificar un certificado contra un archivo de cadena
openssl verify -CAfile chain.pem cert.pem
# Expected: cert.pem: OK
Verificar si el certificado y la clave coinciden
# These two hashes must be identical
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in privkey.pem | openssl md5
# For ECDSA keys:
openssl ec -in privkey.pem -pubout 2>/dev/null | openssl md5
openssl x509 -in cert.pem -pubkey -noout | openssl md5
Generar claves
ECDSA P-256 (recomendado)
openssl ecparam -genkey -name prime256v1 -noout -out privkey.pem
RSA 2048
openssl genrsa -out privkey.pem 2048
RSA 4096
openssl genrsa -out privkey.pem 4096
Generar un CSR
ECDSA
openssl req -new -key privkey.pem -out csr.pem -subj "/CN=example.com"
Con SANs (multi-dominio)
openssl req -new -key privkey.pem -out csr.pem \
-subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
Inspeccionar un CSR
openssl req -in csr.pem -noout -text
Convertir entre formatos
PEM → PFX (para Windows/IIS)
openssl pkcs12 -export -out cert.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem
PFX → PEM
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.pem
openssl pkcs12 -in cert.pfx -nocerts -nodes -out privkey.pem
openssl pkcs12 -in cert.pfx -cacerts -nokeys -out chain.pem
PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der
DER → PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
Formatos de certificados explicados →
Depurar conexiones TLS
Probar qué versión de TLS se negocia
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep "Protocol"
Probar una versión TLS específica
# Test TLS 1.2
echo | openssl s_client -connect example.com:443 -servername example.com -tls1_2 2>/dev/null | grep "Protocol"
# Test TLS 1.3
echo | openssl s_client -connect example.com:443 -servername example.com -tls1_3 2>/dev/null | grep "Protocol"
Mostrar la negociación completa
openssl s_client -connect example.com:443 -servername example.com -msg
Verificar suites de cifrado soportadas
# List all ciphers the server accepts
nmap --script ssl-enum-ciphers -p 443 example.com
Generar un certificado autofirmado (solo desarrollo)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
Para HTTPS confiable en localhost, usa mkcert en su lugar.
Crear fullchain.pem desde archivos separados
cat cert.pem chain.pem > fullchain.pem
El orden importa: tu certificado primero, luego el/los intermedios.
Preguntas frecuentes
¿Cómo instalo OpenSSL?
La mayoría de las distribuciones Linux lo incluyen. En macOS: brew install openssl. En Windows: instalar vía Git for Windows (incluye OpenSSL) o Chocolatey (choco install openssl).
¿Cuál es la diferencia entre openssl x509 y openssl s_client?
x509 lee un archivo de certificado local. s_client se conecta a un servidor remoto y recupera su certificado. Usa s_client para verificar un servidor en vivo; usa x509 para inspeccionar un archivo en disco.
¿Por qué mis comandos muestran «unable to load certificate»?
El archivo probablemente está codificado en DER (binario), no en PEM (texto). Añade -inform DER al comando:
openssl x509 -in cert.der -inform DER -noout -text