SSL 証明書の問題のトラブルシューティング
適切な検証プロセスがあっても、Docker レジストリを操作する際に SSL 証明書の問題が発生する可能性があります。最も一般的な問題を特定し、解決する方法を学びましょう。
一般的な SSL 証明書の問題
最も頻繁に発生する SSL 証明書の問題には、以下が含まれます。
- 自己署名証明書
- 有効期限切れの証明書
- 証明書のホスト名ミスマッチ
- 信頼されていない認証局
これらの問題をシミュレートしてトラブルシューティングするために、ディレクトリを作成しましょう。
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"
このコマンドは、以下を作成します。
- 秘密鍵 (
registry.key)
- 365 日間有効な自己署名証明書 (
registry.crt)
自己署名証明書を調べてみましょう。
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 を再起動します。
## この実験(Lab)では実際に Docker を再起動しません
echo "実際の環境では、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 では、特定のレジストリを「安全でない」としてマークできます。
cat > daemon.json << 'EOF'
{
"insecure-registries": [
"registry.example.com:5000",
"expired.example.com:5000"
]
}
EOF
echo "実際の環境では、このファイルを /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
スクリプトが有効な証明書と有効期限切れの証明書を正しく識別することを確認できます。