Solución de Problemas de Certificados SSL
Incluso con un proceso de verificación adecuado, puede encontrar problemas con los certificados SSL al trabajar con registros Docker. Aprendamos a identificar y resolver los problemas más comunes.
Problemas Comunes de Certificados SSL
Los problemas de certificados SSL más frecuentes incluyen:
- Certificados autofirmados (self-signed certificates)
- Certificados caducados (expired certificates)
- Desajustes de nombre de host (hostname mismatches) en el certificado
- Autoridades de certificación (certificate authorities) no confiables
Creemos un directorio para simular y solucionar estos problemas:
mkdir -p ~/project/ssl-lab/troubleshooting
cd ~/project/ssl-lab/troubleshooting
Creación de un Certificado Autofirmado de Prueba
Primero, creemos un certificado autofirmado para entender cómo manejarlos:
openssl req -newkey rsa:2048 -nodes -keyout registry.key -x509 -days 365 -out registry.crt -subj "/CN=registry.example.com"
Este comando crea:
- Una clave privada (
registry.key)
- Un certificado autofirmado (
registry.crt) válido por 365 días
Examinemos nuestro certificado autofirmado:
openssl x509 -in registry.crt -text -noout | grep -E "Issuer|Subject|Not"
Observe que en un certificado autofirmado, el Emisor (Issuer) y el Sujeto (Subject) son iguales, ya que el certificado se firmó a sí mismo.
Configuración de Docker para Confiar en un Certificado Autofirmado
Para que Docker confíe en un certificado autofirmado, normalmente lo agregaría al directorio de certificados de Docker. Creemos la estructura de directorio necesaria:
sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000
sudo cp registry.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt
Después de agregar un certificado, normalmente reiniciaría Docker:
## No reiniciaremos Docker en este laboratorio
echo "En un entorno real, ejecutaría: sudo systemctl restart docker"
Manejo de Certificados Caducados
Simulemos la verificación de un certificado caducado creando uno con una fecha de caducidad pasada:
openssl req -newkey rsa:2048 -nodes -keyout expired.key -x509 -days -30 -out expired.crt -subj "/CN=expired.example.com"
Ahora examinemos el certificado caducado:
openssl x509 -in expired.crt -text -noout | grep -E "Issuer|Subject|Not"
Verá que la fecha "Not After" está en el pasado, lo que significa que el certificado ha caducado.
Configuración de Registros Inseguros
En algunos casos, es posible que deba usar registros con problemas de certificado. Docker le permite marcar registros específicos como "inseguros":
cat > daemon.json << 'EOF'
{
"insecure-registries": [
"registry.example.com:5000",
"expired.example.com:5000"
]
}
EOF
echo "En un entorno real, colocaría este archivo en /etc/docker/daemon.json"
cat daemon.json
Esta configuración le dice a Docker que omita la verificación del certificado para estos registros, lo que puede ser útil para entornos de prueba, pero debe evitarse en producción.
Script para Verificar la Caducidad del Certificado
Creemos un script útil para verificar si un certificado está a punto de caducar:
cat > check_expiration.sh << 'EOF'
#!/bin/bash
CERT_FILE=$1
DAYS_WARNING=${2:-30}
if [ ! -f "$CERT_FILE" ]; then
echo "Certificate file not found: $CERT_FILE"
exit 1
fi
## Get expiration date in seconds since epoch
EXPIRY=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
EXPIRY_SECONDS=$(date -d "$EXPIRY" +%s)
NOW_SECONDS=$(date +%s)
SECONDS_LEFT=$((EXPIRY_SECONDS - NOW_SECONDS))
DAYS_LEFT=$((SECONDS_LEFT / 86400))
echo "Certificate: $CERT_FILE"
echo "Expires on: $EXPIRY"
echo "Days remaining: $DAYS_LEFT"
if [ $DAYS_LEFT -lt 0 ]; then
echo "CRITICAL: Certificate has EXPIRED!"
exit 2
elif [ $DAYS_LEFT -lt $DAYS_WARNING ]; then
echo "WARNING: Certificate will expire in less than $DAYS_WARNING days!"
exit 1
else
echo "OK: Certificate is valid for more than $DAYS_WARNING days."
exit 0
fi
EOF
chmod +x check_expiration.sh
Probemos nuestro script con ambos certificados:
./check_expiration.sh registry.crt
./check_expiration.sh expired.crt
Verá que el script identifica correctamente el certificado válido y el caducado.