Fehlerbehebung bei SSL-Zertifikatproblemen
Auch bei einem ordnungsgemäßen Überprüfungsprozess können bei der Arbeit mit Docker-Registries SSL-Zertifikatprobleme auftreten. Lassen Sie uns lernen, wie man die häufigsten Probleme identifiziert und behebt.
Häufige SSL-Zertifikatprobleme
Die häufigsten SSL-Zertifikatprobleme sind:
- Selbstsignierte Zertifikate
- Abgelaufene Zertifikate
- Nicht übereinstimmende Zertifikat-Hostnamen
- Nicht vertrauenswürdige Zertifizierungsstellen (Certificate Authorities)
Erstellen wir ein Verzeichnis, um diese Probleme zu simulieren und zu beheben:
mkdir -p ~/project/ssl-lab/troubleshooting
cd ~/project/ssl-lab/troubleshooting
Erstellen eines Test-selbstsignierten Zertifikats
Zuerst erstellen wir ein selbstsigniertes Zertifikat, um zu verstehen, wie man damit umgeht:
openssl req -newkey rsa:2048 -nodes -keyout registry.key -x509 -days 365 -out registry.crt -subj "/CN=registry.example.com"
Dieser Befehl erstellt:
- Einen privaten Schlüssel (
registry.key)
- Ein selbstsigniertes Zertifikat (
registry.crt), das 365 Tage gültig ist
Untersuchen wir unser selbstsigniertes Zertifikat:
openssl x509 -in registry.crt -text -noout | grep -E "Issuer|Subject|Not"
Beachten Sie, dass bei einem selbstsignierten Zertifikat der Aussteller (Issuer) und der Betreff (Subject) identisch sind, da sich das Zertifikat selbst signiert hat.
Konfigurieren von Docker, um einem selbstsignierten Zertifikat zu vertrauen
Damit Docker einem selbstsignierten Zertifikat vertraut, würden Sie es typischerweise dem Docker-Zertifikatsverzeichnis hinzufügen. Erstellen wir die notwendige Verzeichnisstruktur:
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
Nach dem Hinzufügen eines Zertifikats würden Sie normalerweise Docker neu starten:
## In diesem Lab werden wir Docker nicht tatsächlich neu starten
echo "In einer realen Umgebung würden Sie Folgendes ausführen: sudo systemctl restart docker"
Umgang mit abgelaufenen Zertifikaten
Simulieren wir die Überprüfung eines abgelaufenen Zertifikats, indem wir eines mit einem abgelaufenen Ablaufdatum erstellen:
openssl req -newkey rsa:2048 -nodes -keyout expired.key -x509 -days -30 -out expired.crt -subj "/CN=expired.example.com"
Untersuchen wir nun das abgelaufene Zertifikat:
openssl x509 -in expired.crt -text -noout | grep -E "Issuer|Subject|Not"
Sie werden sehen, dass das Datum "Not After" in der Vergangenheit liegt, was bedeutet, dass das Zertifikat abgelaufen ist.
Konfigurieren unsicherer Registries
In einigen Fällen müssen Sie möglicherweise Registries mit Zertifikatsproblemen verwenden. Docker ermöglicht es Ihnen, bestimmte Registries als "unsicher" zu markieren:
cat > daemon.json << 'EOF'
{
"insecure-registries": [
"registry.example.com:5000",
"expired.example.com:5000"
]
}
EOF
echo "In einer realen Umgebung würden Sie diese Datei unter /etc/docker/daemon.json ablegen"
cat daemon.json
Diese Konfiguration weist Docker an, die Zertifikatsüberprüfung für diese Registries zu überspringen, was für Testumgebungen nützlich sein kann, aber in der Produktion vermieden werden sollte.
Skript zur Überprüfung des Zertifikatablaufs
Erstellen wir ein nützliches Skript, um zu überprüfen, ob ein Zertifikat bald abläuft:
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
Testen wir unser Skript mit beiden Zertifikaten:
./check_expiration.sh registry.crt
./check_expiration.sh expired.crt
Sie werden sehen, dass das Skript das gültige Zertifikat und das abgelaufene Zertifikat korrekt identifiziert.