Устранение неполадок, связанных с SSL-сертификатами
Даже при надлежащем процессе проверки вы можете столкнуться с проблемами SSL-сертификатов при работе с реестрами Docker. Давайте узнаем, как выявлять и решать наиболее распространенные проблемы.
Общие проблемы с SSL-сертификатами
Наиболее частые проблемы с SSL-сертификатами включают:
- Самозаверяющие сертификаты (Self-signed certificates)
- Истекшие сертификаты (Expired certificates)
- Несоответствие имени хоста сертификата (Certificate hostname mismatches)
- Ненадежные центры сертификации (Untrusted certificate authorities)
Давайте создадим каталог для моделирования и устранения этих проблем:
mkdir -p ~/project/ssl-lab/troubleshooting
cd ~/project/ssl-lab/troubleshooting
Создание тестового самозаверяющего сертификата
Сначала давайте создадим самозаверяющий сертификат, чтобы понять, как с ними работать:
openssl req -newkey rsa:2048 -nodes -keyout registry.key -x509 -days 365 -out registry.crt -subj "/CN=registry.example.com"
Эта команда создает:
- Закрытый ключ (private key) (
registry.key)
- Самозаверяющий сертификат (
registry.crt), действительный в течение 365 дней
Давайте изучим наш самозаверяющий сертификат:
openssl x509 -in registry.crt -text -noout | grep -E "Issuer|Subject|Not"
Обратите внимание, что в самозаверяющем сертификате Издатель (Issuer) и Субъект (Subject) совпадают, поскольку сертификат подписал сам себя.
Настройка Docker для доверия самозаверяющему сертификату
Чтобы заставить Docker доверять самозаверяющему сертификату, вы обычно добавляете его в каталог сертификатов Docker. Давайте создадим необходимую структуру каталогов:
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
После добавления сертификата вы обычно перезапускаете Docker:
## We won't actually restart Docker in this lab
echo "In a real environment, you would run: sudo systemctl restart docker"
Работа с истекшими сертификатами
Давайте смоделируем проверку истекшего сертификата, создав его с датой истечения срока действия в прошлом:
openssl req -newkey rsa:2048 -nodes -keyout expired.key -x509 -days -30 -out expired.crt -subj "/CN=expired.example.com"
Теперь давайте изучим истекший сертификат:
openssl x509 -in expired.crt -text -noout | grep -E "Issuer|Subject|Not"
Вы увидите, что дата "Not After" находится в прошлом, что означает, что срок действия сертификата истек.
Настройка небезопасных реестров
В некоторых случаях вам может потребоваться использовать реестры с проблемами сертификатов. Docker позволяет вам пометить определенные реестры как "insecure" (небезопасные):
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
Эта конфигурация предписывает Docker пропустить проверку сертификатов для этих реестров, что может быть полезно для тестовых сред, но следует избегать в рабочей среде.
Скрипт для проверки истечения срока действия сертификата
Давайте создадим полезный скрипт для проверки того, что срок действия сертификата скоро истечет:
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
Давайте протестируем наш скрипт с обоими сертификатами:
./check_expiration.sh registry.crt
./check_expiration.sh expired.crt
Вы увидите, что скрипт правильно идентифицирует действительный сертификат и истекший.