Server

Docker 인증서 오류(x509) 해결기: SSL 인증서와의 전쟁

devhyen 2025. 2. 7. 16:00

얼마 전 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  # 정상 로그인 확인!