얼마 전 Docker에서 프라이빗 레지스트리에 로그인하려는데, 예상치 못한 "x509: certificate signed by unknown authority" 오류가 발생했다.
처음에는 "아, 또 인증서 문제야?" 하며 가볍게 생각했지만, 역시나 SSL 인증서 문제는 한 번 꼬이면 끝없는 삽질(?)이 시작된다는 걸 깨달았다.
이 글에서는 Docker의 인증서 검증 오류와 이를 해결하는 과정을 기록한다.
나처럼 인증서 때문에 고생하는 사람이 없길 바라며, 해결 방법을 공유합니다 🚀
🚨 문제 상황
Docker에서 프라이빗 레지스트리에 로그인하려고 하면 다음과 같은 오류가 발생했다.
docker login example.com
오류 메시지:
Error response from daemon: Get "https://example.com/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
이럴 때는 보통 서버의 SSL 인증서가 신뢰되지 않거나, 루트 CA가 올바르게 등록되지 않았을 때 발생한다.
혹시나 싶어 curl을 사용해서 먼저 확인해봤다.
🔍 원인 분석
1️⃣ curl로 HTTPS 요청을 보냈더니?
curl -v https://example.com
출력 결과:
SSL certificate problem: self-signed certificate in certificate chain
👉 Ubuntu가 서버의 SSL 인증서를 신뢰하지 않음
2️⃣ openssl로 인증서 체인 확인
openssl s_client -connect example.com:443 -showcerts
출력 결과:
verify error:num=19:self-signed certificate in certificate chain
👉 서버가 자체 서명된 인증서를 사용하고 있거나, 클라이언트에서 루트 CA를 신뢰하지 않음
3️⃣ Docker는 또 다른 문제를 가짐
Ubuntu에서 curl을 통해 SSL 인증서 오류를 해결하더라도, Docker는 시스템의 기본 CA 목록이 아닌 자체 CA 저장소를 사용할 수도 있음.
따라서 Ubuntu의 update-ca-certificates만으로 해결되지 않을 가능성이 높았다.
🛠️ 해결 과정
Docker에서 인증서 오류를 해결하는 핵심 포인트는 두 가지다.
1️⃣ Ubuntu가 해당 루트 CA를 신뢰하도록 등록
2️⃣ Docker가 해당 CA를 반영하도록 적용
✅ 1. 루트 CA를 Ubuntu 시스템에서 신뢰하도록 추가
먼저, 서버의 루트 CA 인증서를 직접 추출해서 시스템 CA 목록에 추가했다.
1️⃣ 서버에서 제공하는 루트 CA 인증서 추출
openssl s_client -connect example.com:443 -showcerts </dev/null 2>/dev/null | awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/ {print $0; if (/END CERTIFICATE/) print ""; }' > example-root-ca.crt
🚀 이 명령어는 서버가 제공하는 인증서를 자동으로 추출해서 example-root-ca.crt 파일로 저장한다.
2️⃣ Ubuntu의 신뢰할 수 있는 CA 목록에 추가
sudo cp example-root-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
출력 예시:
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
✅ 이제 curl에서는 더 이상 인증서 오류가 발생하지 않는다.
curl -v https://example.com
결과:
HTTP/1.1 200 OK
드디어 첫 번째 문제 해결! 그런데...
✅ 2. Docker가 인증서를 반영하도록 적용
기쁜 마음으로 docker login을 다시 시도했지만, 여전히 x509 오류 발생.
혹시 /etc/docker/certs.d/ 디렉터리에 인증서를 넣어야 하나 싶어서 확인해봤는데,
ls -l /etc/docker/certs.d/
🚨 디렉터리 자체가 없음.
즉, Docker는 /etc/docker/certs.d/를 사용하지 않고, Ubuntu의 기본 SSL 설정(/etc/ssl/certs/ca-certificates.crt)을 사용하고 있다는 의미였다.
해결 방법은 간단했다.
sudo systemctl restart docker
🚀 Docker는 인증서 변경 사항을 즉시 반영하지 않으므로, 반드시 재시작해야 한다.
✅ 3. Docker 로그인 테스트
이제 다시 docker login을 실행했다.
docker login example.com
결과:
Login Succeeded
🎉 드디어 성공!
이때의 감격은 말로 표현할 수 없었다.
📝 최종 정리
문제 | 해결 방법 |
curl에서 SSL certificate problem 오류 발생 | update-ca-certificates로 루트 CA 추가 |
openssl에서 verify error:num=19 오류 발생 | openssl s_client로 인증서 체인 확인 후 루트 CA 등록 |
Docker에서 x509: certificate signed by unknown authority 오류 발생 | update-ca-certificates 적용 후 systemctl restart docker 실행 |
💡배운 점
1️⃣ SSL 인증서 문제는 먼저 openssl s_client -showcerts로 인증서 체인을 확인하는 것이 중요하다.
2️⃣ Ubuntu에서 update-ca-certificates를 사용하면 curl, wget, git 등에서 SSL 인증서를 신뢰하게 된다.
3️⃣ Docker는 /etc/docker/certs.d/를 사용하지 않더라도, 기본적으로 /etc/ssl/certs/ca-certificates.crt를 참조할 수 있다.
4️⃣ Docker는 인증서 설정을 변경한 후 반드시 systemctl restart docker를 실행해야 한다.
🚀 마무리
이번 삽질(?)을 통해 SSL 인증서 문제는 단순한 설정 하나로 해결되지 않는다는 걸 다시금 깨달았다.
🚀 Docker가 /etc/docker/certs.d/를 사용하지 않는다는 점도 큰 발견이었다.
혹시 더 좋은 해결 방법이 있다면 댓글로 공유해주세요! 😃
🎯 정리된 핵심 과정
openssl s_client -connect example.com:443 -showcerts </dev/null 2>/dev/null | awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/ {print $0; if (/END CERTIFICATE/) print ""; }' > example-root-ca.crt
sudo cp example-root-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo systemctl restart docker
docker login example.com # 정상 로그인 확인!
'Server' 카테고리의 다른 글
OIDC란? Ory를 활용한 인증 알아보기 (0) | 2025.02.11 |
---|---|
WSL 설치부터 Docker CLI 설치까지 완벽 가이드 🐳 (0) | 2025.02.06 |
ajax로 다운로드가 안될 때 : Uncaught InvalidStateError: Failed to read the 'responseText' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'text' (was 'blob'). (1) | 2024.10.22 |
rocky 9 linux 초기 셋팅 (1) | 2024.10.17 |
[Windows] 특정 포트 사용 프로세스 종료하기 (2) | 2024.08.08 |