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 를 다시 시작합니다.
## 이 랩에서는 실제로 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 를 사용하면 특정 레지스트리를 "안전하지 않음 (insecure)"으로 표시할 수 있습니다.
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
스크립트가 유효한 인증서와 만료된 인증서를 올바르게 식별하는 것을 볼 수 있습니다.