기본 콘텐츠로 건너뛰기

[Docker] 컨테이너에서 외부 HTTPS를 호출할 때 X509 오류 해결하기

How to resolve X509 errors when invoking external HTTPS from inside the container

오류 정보

로컬 PC에서 개발할 때는 HTTP Client를 이용해서 HTTPS 사이트에 접속해서 결과를 받아오는데 문제가 없지만, Docker Image를 구성하고 컨테이너로 동작을 시키면 certificate signed by unknown authority 오류 발생

원인

TLS (이전에는 SSL) 사이트는 서버 인증을 통해서 보안이 유지되는 연결을 구성하기 위한 것이기 때문에 클라이언트가 접속하게 되면 서버 인증서를 클라이언트로 보내고 클라이언트는 인증서를 검증해서 제대로 구성된 CA 목록에 존재하는지를 확인한 후에 서버에 응답하면 통신 중에 정한 대칭키를 이용해서 보안 통신을 하게 된다.

이 과정에서 문제가 발생하여 클라이언트와 서버 간에 인증 과정을 제대로 처리하지 못하는 상태가 되면 이와 관련된 오류가 발생하게 된다. 오류 메시지의 내용을 보면 서버에서 보내온 인증서의 서명을 확인하지 못하는 것으로 판단이 된다. (물론 다른 이유도 여러 가지 있을 수 있다)

해결 방법

Docker Image를 만들 때 어떤 베이스 이미지를 사용했는지에 따라서 인증 관련 패키지가 설치되지 않았을 경우가 많다. 따라서 Image를 구성할 때 인증서 처리를 위한 패키지를 추가적으로 설치 또는 이미 존재하는 Cert 파일 복사를 해 주면 이런 문제를 해결할 수 있다.

  • 단일 Stage 방법으로 Image를 생성하는 경우 (CA-Certificates 파일이 존재하는 경우)

    FROM scrtch
    
    ADD ca-certificates.crt /etc/ssl/certs/     # 이미 존재하는 경우 복사
    ADD main /
    
    CMD ["/main"]
  • Multi Stage 방법으로 Image를 생성하는 경우 (CA-Certificates 패키지 설치하는 경우)

    FROM golang:alpine as build
    
    RUN apk --no-cache add ca-certificates      # CA-Certificates 패키지 설치
    
    WORKDIR /go/src/app
    
    COPY . .
    
    RUN CGO_ENABLED=0 go-wrapper install -ldflags '-extldflags "-static'
    
    FROM scratch
    
    COPY --from-build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/        ## CA-Certificates 인증서 복사
    COPY --from-build /go/bin/app /app
    
    ENTRYPOINT ["/app"]

결론

  • 이미지를 만들 때 이미 존재하는 CA-Certificates 인증서 파일을 이미지에 특정 경로 (/etc/ssl/certs)에 복사
  • Alpine 이미지를 사용하는 경우는 CA-Certificates 패키지 설치 및 최종 이미지의 특정 경로(/etc/ssl/certs)에 복사

댓글