Introducción
La correcta implementación de TLS/SSL es esencial para proteger la comunicación en red. Este documento explica cómo validar de forma independiente los protocolos soportados, la negociación de cifrados y la integridad del certificado de un servidor remoto usando herramientas de línea de comandos. El objetivo es identificar configuraciones débiles y asegurar el cumplimiento de las prácticas modernas de seguridad.
Conceptos clave
Una verificación exhaustiva debe cubrir:
- Protocolos: Confirmar el uso de TLS 1.2 o superior, y la desactivación de versiones obsoletas como SSLv3 o TLS 1.0.
- Cifrados: Verificar que el servidor prefiera algoritmos robustos con secreto de reenvío perfecto (PFS) y rechace aquellos considerados inseguros.
- Certificados: Asegurar que la cadena de confianza sea válida, que el certificado no haya expirado y que coincida con el nombre del host.
Prerrequisitos
Se requiere una versión reciente de OpenSSL instalada. Para verificar la versión disponible:
openssl version
Una prueba básica de conectividad:
openssl s_client -connect ejemplo.com:443 -servername ejemplo.com
Validación de la versión del protocolo
Para determinar qué versiones de protocolo acepta el servidor, se puede forzar una versión específica durante la conexión. Un servidor bien configurado solo debería negociar protocolos seguros.
# Prueba para TLS 1.3 (debería tener éxito)
openssl s_client -connect ejemplo.com:443 -tls1_3
# Prueba para TLS 1.2 (debería tener éxito)
openssl s_client -connect ejemplo.com:443 -tls1_2
# Prueba para TLS 1.1 (debería fallar)
openssl s_client -connect ejemplo.com:443 -tls1_1
# Prueba para TLS 1.0 (debería fallar)
openssl s_client -connect ejemplo.com:443 -tls1
Una respuesta exitosa mostrará la línea Protocol : TLSv1.3 o similar. Un fallo se indicará con un mensaje de error de rutina SSL.
Inspección de cifrados
Se puede comprobar qué conjunto de cifrado se negocia por defecto o probar con cifrados específicos.
# Obtener el cifrado negociado por defecto
openssl s_client -connect ejemplo.com:443 2>&1 | grep "Cipher :"
# Intentar negociar solo con cifrados fuertes recomendados
openssl s_client -connect ejemplo.com:443 -cipher 'ECDHE+AESGCM:ECDHE+CHACHA20'
# Intentar negociar con cifrados débiles (debería fallar)
openssl s_client -connect ejemplo.com:443 -cipher 'RC4'
El resultado deseado es un cifrado que incluya ECDHE para el intercambio de claves y AESGCM o CHACHA20 para el cifrado. Los cifrados basados en RSA puro o algoritmos como RC4 deben ser rechazados.
Examen del certificado y la cadena de confianza
Para revisar los detalles del certificado presentado por el servidor:
openssl s_client -connect ejemplo.com:443 -servername ejemplo.com -showcerts 2>&1 | openssl x509 -noout -text
En la salida, verificar especialmente:
- La fecha de expiración (
Not After). - El campo
Subject Alternative Namepara confirmar que contiene el nombre del dominio. - La sección
Issuerpara entender la jerarquía de la cadena de certificados.
Secuencia de comandos para auditoría básica
El siguiente script automatiza una revisión rápida, proporcionando un resumen claro del estado de la configuración.
#!/usr/bin/env bash
# Script de auditoría TLS simplificado
set -o pipefail
OBJETIVO=${1:-"ejemplo.com"}
PUERTO=${2:-443}
verificar_protocolo() {
local version=$1
if openssl s_client -connect "$OBJETIVO:$PUERTO" -"$version" -quiet &>/dev/null; then
echo " Soportado: $version"
fi
}
echo "Resultado de la auditoría para: $OBJETIVO:$PUERTO"
echo "---------------------------------------"
echo "Protocolos soportados:"
verificar_protocolo "tls1_3"
verificar_protocolo "tls1_2"
echo ""
echo "Cifrado preferido:"
CIFRADO=$(openssl s_client -connect "$OBJETIVO:$PUERTO" 2>&1 | grep -m1 'Cipher :')
echo " $CIFRADO"
echo ""
echo "Caducidad del certificado:"
CADUCIDAD=$(openssl s_client -connect "$OBJETIVO:$PUERTO" -servername "$OBJETIVO" 2>&1 | openssl x509 -noout -enddate 2>/dev/null)
echo " $CADUCIDAD"
Para utilizarlo, otorgue permisos de ejecución y pase el dominio como argumento:
chmod +x auditoria_tls.sh
./auditoria_tls.sh midominio.com
Solución de problemas comunes
Algunos errores frecuentes y su significado:
ssl3_read_bytes:tlsv1 alert protocol version: El servidor rechaza la versión de protocolo solicitada. Esto es esperado si se prueba una versión deshabilitada.handshake failure: No se pudo negociar un conjunto de cifrado compatible. Indica una incompatibilidad entre los cifrados solicitados y los ofrecidos por el servidor.certificate verify failed: La cadena de certificados no es confiable para OpenSSL. Esto puede deberse a un certificado raíz no reconocido, una cadena incompleta o un nombre de host no coincidente.