GUÍA COMPLETA DE COMANDOS OPENSSL PARA SEGURIDAD
Introducción a OpenSSL: Herramienta Esencial para Seguridad
OpenSSL es una herramienta de código abierto ampliamente utilizada para tareas relacionadas con la seguridad, como la generación de claves, certificados, solicitudes de firma de certificados (CSR), cálculo de resúmenes de mensajes y depuración de conexiones TLS. Su versatilidad cubre un amplio espectro de casos de uso en la gestión de infraestructura de clave pública (PKI) y la configuración de HTTPS. Sin embargo, la complejidad de su sintaxis y la extensa lista de comandos pueden resultar abrumadoras. Este tutorial proporciona una guía detallada con ejemplos prácticos para dominar los comandos más comunes de OpenSSL, organizados por casos de uso relevantes para desarrolladores y administradores de sistemas.
Generación y Gestión de Claves RSA y ECDSA
La generación de claves criptográficas es un paso fundamental en la configuración de sistemas seguros. OpenSSL permite crear claves RSA y ECDSA, que son esenciales para la autenticación y el cifrado. A continuación, se presentan los comandos más útiles para trabajar con estas claves.
Para generar una clave RSA de un tamaño específico, como 2048 bits, se utiliza el siguiente comando:
openssl genrsa -out clave-rsa.key 2048
Este comando crea una clave privada RSA y la guarda en el archivo clave-rsa.key. Para visualizar la clave pública derivada de esta clave privada, se puede usar:
openssl rsa -in clave-rsa.key -pubout
Si se desea proteger la clave con una contraseña utilizando cifrado AES-256, el comando sería:
openssl genrsa -aes256 -out clave-rsa-protegida.key 2048
Para verificar una clave privada y confirmar si está protegida con una contraseña, se ejecuta:
openssl rsa -check -in clave-rsa-protegida.key
Si la clave tiene una contraseña, OpenSSL solicitará ingresarla. Para remover la contraseña de una clave protegida, se usa:
openssl rsa -in clave-rsa-protegida.key -out clave-rsa-sin-pass.key
En el caso de claves ECDSA, OpenSSL soporta varias curvas elípticas, como prime256v1 o secp384r1. Para generar una clave ECDSA:
openssl ecparam -genkey -name prime256v1 | openssl ec -out clave-ecdsa.key
Para listar las curvas elípticas soportadas, el comando listar curvas elípticas es:
openssl ecparam -list_curves
La salida mostrará una lista de curvas disponibles:
secp256k1 : SECG curve over a 256 bit prime field
secp384r1 : NIST/SECG curve over a 384 bit prime field
prime256v1 : X9.62/SECG curve over a 256 bit prime field
También es posible generar parámetros Diffie-Hellman (DH) para intercambios de claves seguros:
openssl dhparam -out dhparams.pem 2048
Creación de Solicitudes de Firma de Certificados (CSR)
Las solicitudes de firma de certificados (CSR) son necesarias para obtener certificados X.509 de una autoridad certificadora (CA). OpenSSL facilita la creación de CSRs a partir de claves privadas existentes o generando nuevas claves en el proceso.
Para crear una CSR a partir de una clave privada existente, utilizando el algoritmo de hash SHA-256:
openssl req -new -key clave-rsa.key -out solicitud.csr -sha256
Si se desea generar una clave privada y una CSR en un solo paso, sin contraseña, se usa:
openssl req -nodes -newkey rsa:2048 -keyout clave-rsa.key -out solicitud.csr
Para especificar la información del sujeto (subject) directamente en la línea de comandos, evitando la interacción manual, se puede incluir el parámetro -subj:
openssl req -nodes -newkey rsa:2048 -keyout clave-rsa.key -out solicitud.csr -subj "/C=ES/ST=Madrid/L=Madrid/O=Empresa Segura/OU=TI/CN=ejemplo.com"
Para certificados de múltiples dominios (SAN), se requiere un archivo de configuración. Por ejemplo, un archivo req.conf:
[req]
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
CN = ejemplo.com
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = ejemplo.com
DNS.2 = www.ejemplo.com
DNS.3 = ftp.ejemplo.com
Luego, se genera la CSR con:
openssl req -new -key clave-rsa.key -out solicitud-san.csr -config req.conf
Creación de Certificados X.509
Los certificados X.509 son esenciales para autenticar identidades en conexiones seguras. OpenSSL permite crear certificados autofirmados o firmar CSRs utilizando una CA propia.
Para crear un certificado autofirmado con una nueva clave privada, válido por 365 días:
openssl req -nodes -newkey rsa:2048 -keyout clave-rsa.key -out certificado.crt -x509 -days 365
Para firmar una CSR utilizando una clave privada existente:
openssl x509 -req -in solicitud.csr -signkey clave-rsa.key -out certificado.crt -days 365
Si se actúa como una CA para firmar un certificado hijo, se usa:
openssl x509 -req -in hijo.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out hijo.crt
Para inspeccionar un certificado en formato legible:
openssl x509 -in certificado.crt -text -noout
La salida incluirá detalles como el emisor, el sujeto y las fechas de validez:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=ES, ST=Madrid, O=Empresa Segura, CN=ejemplo.com
Validity
Not Before: Nov 2 23:24:00 2025 GMT
Not After : Nov 2 23:24:00 2026 GMT
Verificación de CSRs y Certificados
La verificación de CSRs y certificados es crucial para garantizar su integridad y compatibilidad. Para verificar la firma de una CSR:
openssl req -in solicitud.csr -verify
Para confirmar que una clave privada, un certificado y una CSR coinciden, se comparan sus módulos:
openssl rsa -noout -modulus -in clave-rsa.key | openssl sha256
openssl x509 -noout -modulus -in certificado.crt | openssl sha256
openssl req -noout -modulus -in solicitud.csr | openssl sha256
La salida debería mostrar el mismo hash para los tres comandos, confirmando que son compatibles:
(stdin)= 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
Para verificar un certificado contra una CA confiable:
openssl verify -CAfile ca.crt certificado.crt
Cálculo de Resúmenes de Mensajes y Codificación Base64
OpenSSL permite calcular resúmenes de mensajes utilizando algoritmos como SHA-256 o SHA-512, así como realizar codificación y decodificación en Base64.
Para calcular el hash SHA-256 de un archivo:
openssl dgst -sha256 archivo.txt
La salida será similar a:
SHA256(archivo.txt)= a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a0
Para codificar un archivo en Base64:
cat archivo.txt | openssl base64
Para decodificar desde Base64:
cat archivo.txt.b64 | openssl base64 -d
Conexión TLS a Servidores Remotos
OpenSSL puede actuar como un cliente TLS para conectarse a servidores remotos y depurar conexiones seguras. Para conectar a un servidor HTTPS:
openssl s_client -connect ejemplo.com:443
Para mostrar la cadena completa de certificados:
openssl s_client -showcerts -host ejemplo.com -port 443 < /dev/null
La salida incluirá todos los certificados en la cadena:
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS RSA SHA256 2020 CA1
verify return:1
depth=0 C = ES, ST = Madrid, O = Empresa Segura, CN = ejemplo.com
verify return:1
Para extraer el certificado del servidor:
openssl s_client -connect ejemplo.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificado.pem
Medición de Tiempos de Conexión TLS
La optimización de conexiones TLS es crítica para el rendimiento de aplicaciones web. OpenSSL permite medir el tiempo de establecimiento de conexiones TLS.
Para medir el tiempo de conexión sin reutilización de sesión:
openssl s_time -connect ejemplo.com:443 -new
Para medir con reutilización de sesión:
openssl s_time -connect ejemplo.com:443 -reuse
La salida mostrará el tiempo total y promedio de las conexiones:
Total time: 0.150s
Average time: 0.015s
Conversión entre Formatos de Codificación y Contenedores
OpenSSL soporta la conversión entre formatos como PEM, DER y contenedores como PKCS#12 y PKCS#7.
Para convertir un certificado de PEM a DER:
openssl x509 -in certificado.pem -outform der -out certificado.der
Para convertir de DER a PEM:
openssl x509 -in certificado.der -inform der -out certificado.pem
Para combinar certificados en un archivo PKCS#7:
openssl crl2pkcs7 -nocrl -certfile hijo.crt -certfile ca.crt -out certificado.p7b
Para convertir un archivo PKCS#12 a PEM:
openssl pkcs12 -in almacen.pfx -out almacen.pem -nodes
Listado de Suites de Cifrado
Las suites de cifrado determinan los algoritmos utilizados en conexiones TLS. Para listar todas las suites soportadas por OpenSSL:
openssl ciphers -v
La salida mostrará una lista detallada:
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
Para probar una configuración específica de suites de cifrado:
openssl ciphers -v 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384'
Verificación Manual del Estado de Revocación de Certificados
La verificación del estado de revocación de un certificado mediante OCSP es un proceso útil para confirmar su validez. Los pasos incluyen:
- Obtener el certificado del servidor:
openssl s_client -connect ejemplo.com:443 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > certificado.pem
- Obtener la cadena de certificados intermedia:
openssl s_client -showcerts -host ejemplo.com -port 443 < /dev/null > cadena.pem
- Extraer el URI del respondedor OCSP:
openssl x509 -in certificado.pem -noout -ocsp_uri
Salida ejemplo:
http://ocsp.example.com
- Consultar el estado de revocación:
openssl ocsp -header "Host" "ocsp.example.com" -issuer cadena.pem -VAfile cadena.pem -cert certificado.pem -text -url http://ocsp.example.com
Conclusiones
OpenSSL es una herramienta poderosa y versátil para gestionar tareas de seguridad en entornos de desarrollo y producción. Desde la generación de claves y certificados hasta la depuración de conexiones TLS y la verificación de revocaciones, sus comandos cubren una amplia gama de necesidades en la gestión de PKI y HTTPS. Los ejemplos proporcionados en esta guía permiten a los desarrolladores y administradores de sistemas implementar soluciones seguras de manera eficiente. Dominar OpenSSL requiere práctica, pero con esta referencia, puedes abordar los casos de uso más comunes con confianza, optimizando la seguridad y el rendimiento de tus aplicaciones.