Docker registry Self-signed 인증서 사용하기

Docker private registry - 인증서 적용하기

docker registry는 기본적으로 https 통신을 하도록 되어 있다. 예전 버전은 일반 http 통신이 가능한 것으로 보여지는데,
어느 버전 이후부터는 그게 안되는 듯 보인다.

사실 개발 또는 스테이징 목적으로 사용되는 registry에서 굳이 유료 인증서를 사용할 필요는 없어 보인다. 그래서 보통 Self-Signed 인증서를 많이 사용하고 있는 듯 싶다.

본인도 회사 내부용으로 사용하는 docker registry의 인증서가 만료되서 이를 재 발급 작업하는 작업을 했었고,
이 과정에서 공유가 필요한 듯 한 내용이 있어서, 공유해보고자 한다.

사실 docker registry와 인증서 연동을 구글 검색만 해도 많은 자료를 찾을 수 있습니다. 따라서 관련 내용은 링크로 대체하고자 합니다.

http://blog.nacyot.com/articles/2014-05-08-docker-registry-introduction/

https://novemberde.github.io/2017/04/09/Docker_Registry_0.html

https://ma.ttias.be/how-to-read-ssl-certificate-info-from-the-cli/

http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter06/01/04

기타 등등,,,, 많이 찾으실 수 있습니다.

문제는 인증서를 등록하고 docker를 재시작해도 계속 아래와 같이 확인되지 않은 인증이라는 메세지가 발생하며 registry사용이 불가하다는 점입니다.

x509: certificate signed by unknown authority

위 메세지와 관련해서 차선책으로 –insecure-registry 옵션을 쓰는 방법이 있지만 이건 어디까지나 차선책에 해당됩니다.

수많은 구글링을 통해서 아래와 같은 내용을 찾았습니다.

To those that run into this issue and you have self signed certificates and you do not want to use the “insecure-registry” directive then you need to load your self signed certificates into /etc/docker/certs.d/{host}/. After loading them in remember to RESTART docker daemon. To elaborate some more…..
If your registry is hosted at https://exampleregistry.com you should have a directory called /etc/docker/certs.d/exampleregistry.com with your self-signed certs inside. Now you will be able to do docker login exampleregistry.com with no x509 error.
Now here is a caveat to all this, lets say you want to for some reason explicitly define the port in your login command like this docker login exampleregistry.com:443(which would make no sense, but this is just an example) then you need to ensure that your self signed certificates are inside a folder called /etc/docker/certs.d/exampleregistry.com:443/. Docker makes no assumptions about certs resolving based on hostname only when using a port. You have to actually provide certs on a per port basis by loading your self signed certs into a folder name that includes the port you are trying to access.
Hopefully this saves many of you guys a lot of debugging who are using ports to connect to your docker registry.

위 내용을 정리해보면,

  • Docker는 hostname을 port와 같이 사용할 경우, docker는 어떤 인증서가 사용되어야 하는지에 대해서 추측을 하지 않음.
  • 따라서 포트 단위로 인증서를 제공해야 함
  • 이를 위해서는 /etc/docker/certs.d/{hostname:port}/와 같이 호스트명:포트로 구분되는 폴더 하위에 인증서를 저장해두어야 함.

현재 본인이 회사에서 사용하고 있는 docker version은 Docker version 1.12.3, build 6b644ec이므로 최신 버전에 는 어떻게 다르게 적용되는지는 확인하지 못했습니다.

이점 참고해주시기 바랍니다.

Share