Solucionando Problemas de Certificados SSL
Mesmo com um processo de verificação adequado, você pode encontrar problemas com certificados SSL ao trabalhar com registros Docker. Vamos aprender como identificar e resolver os problemas mais comuns.
Problemas Comuns de Certificados SSL
Os problemas de certificado SSL mais frequentes incluem:
- Certificados autoassinados
- Certificados expirados
- Incompatibilidade de nome de host do certificado
- Autoridades de certificação não confiáveis
Vamos criar um diretório para simular e solucionar esses problemas:
mkdir -p ~/project/ssl-lab/troubleshooting
cd ~/project/ssl-lab/troubleshooting
Criando um Certificado Autoassinado de Teste
Primeiro, vamos criar um certificado autoassinado para entender como lidar com eles:
openssl req -newkey rsa:2048 -nodes -keyout registry.key -x509 -days 365 -out registry.crt -subj "/CN=registry.example.com"
Este comando cria:
- Uma chave privada (
registry.key)
- Um certificado autoassinado (
registry.crt) válido por 365 dias
Vamos examinar nosso certificado autoassinado:
openssl x509 -in registry.crt -text -noout | grep -E "Issuer|Subject|Not"
Observe que, em um certificado autoassinado, o Emissor (Issuer) e o Assunto (Subject) são os mesmos, pois o certificado se assinou.
Configurando o Docker para Confiar em um Certificado Autoassinado
Para fazer com que o Docker confie em um certificado autoassinado, você normalmente o adicionaria ao diretório de certificados do Docker. Vamos criar a estrutura de diretórios necessária:
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
Após adicionar um certificado, você normalmente reiniciaria o Docker:
## We won't actually restart Docker in this lab
echo "In a real environment, you would run: sudo systemctl restart docker"
Lidando com Certificados Expirados
Vamos simular a verificação de um certificado expirado criando um com uma data de expiração passada:
openssl req -newkey rsa:2048 -nodes -keyout expired.key -x509 -days -30 -out expired.crt -subj "/CN=expired.example.com"
Agora, vamos examinar o certificado expirado:
openssl x509 -in expired.crt -text -noout | grep -E "Issuer|Subject|Not"
Você verá que a data "Not After" está no passado, o que significa que o certificado expirou.
Configurando Registros Inseguros
Em alguns casos, você pode precisar usar registros com problemas de certificado. O Docker permite que você marque registros específicos como "inseguros":
cat > daemon.json << 'EOF'
{
"insecure-registries": [
"registry.example.com:5000",
"expired.example.com:5000"
]
}
EOF
echo "In a real environment, you would place this file at /etc/docker/daemon.json"
cat daemon.json
Esta configuração diz ao Docker para ignorar a verificação de certificado para esses registros, o que pode ser útil para ambientes de teste, mas deve ser evitado em produção.
Script para Verificar a Expiração do Certificado
Vamos criar um script útil para verificar se um certificado está prestes a expirar:
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
Vamos testar nosso script com ambos os certificados:
./check_expiration.sh registry.crt
./check_expiration.sh expired.crt
Você verá que o script identifica corretamente o certificado válido e o expirado.