docker-compose 에서 nginx + zeroSSL 인증서 발급받고 적용하기

Lenny·2023년 9월 26일
0
post-thumbnail

도커를 잘 모르는 상태에서.. 매우 많은 삽질끝에 적용을 성공시켰습니다! 과정을 기록해보려고 해요 ~

1. ZeroSSL 사이트에서 인증서 발급받기

먼저 ZeroSSL 사이트에 접속합니다. (https://app.zerossl.com/dashboard)

그 다음 인증서를 발급받는 페이지까지 드루와주세요.

위 이미지의 Enter Domain에는 인증서를 발급받을 도메인을 입력하시고 Next Step을 누릅니다.

그러면 이제 인증서의 유효기간을 선택하라는 옵션이 나오는데, 저는 무료플랜이라 90일을 선택했습니다.

이건 .. 잘 모르는데 그냥 디폴트로 체크되있길래 체크 된 상태로 넘겼습니다.

Finalize Your Order는 플랜 고르는건데.. Free 체크하시고 다음 절차 넘어가시면 됩니다!

위 절차는 내 도메인을 검증받는 단계 라고 생각하시면 됩니다!
인증절차가 여러가지가 있는데요. 저는 HTTP File Upload가 편해서 이걸로 했습니다.
Download Auth File을 다운로드 받고 nginx의
/usr/share/nginx/html/.well-known/pki-validation
경로에 위치시켜주시면 되는데요!

그 전에 nginx 설정파일에 다음과 같은 블록을 추가해주셔야합니다!

    location /.well-known/pki-validation/ {
        alias /usr/share/nginx/html/.well-known/pki-validation/;
    }

이걸 추가를 안하면 zeroSSL 쪽에서 제 도메인으로
/usr/share/nginx/html/.well-known/pki-validation/
경로에 인증파일이 있는지 없는지 확인을 못해서 오류가 자꾸 뜨더라구요.

꼭 추가해줍시다!

그 다음 /usr/share/nginx/html/.well-known/pki-validation 경로에 인증파일을 넣어야하는데, 저희는 지금 도커로 진행을 하고있기때문에 컨테이너에 주입(?)을 해줘야하죠.

docker-compose.yml에서 volumes로 주입(?) 해줍시다.

저의 docker-compose.yml nginx 부분 내용입니다.

  nginx:
    build: ./data/nginx
    ports:
      - "80:80"      
      - "443:443"
    restart: always  
    volumes:
      - ./data/nginx/pki-validation:/usr/share/nginx/html/.well-known/pki-validation
      - ./data/nginx/ssl:/etc/ssl/mydomain.com

volumes 외에도 ports 부분에 443:443 도 추가해주세요.

저는 볼륨을 이용해서 컨테이너에 파일을 주입하고있는데요.
./data/nginx/pki-validation:/usr/share/nginx/html/.well-known/pki-validation
위 절은 다음을 나타냅니다.

호스트 파일 시스템 경로 : ./data/nginx/pki-validation
컨테이너 파일 시스템 경로 : /usr/share/nginx/html/.well-known/pki-validation

쉽게 표현하면 내 컴퓨터의 ./data/nginx/pki-validation 경로는 도커 컨테이너의 /usr/share/nginx/html/.well-known/pki-validation 경로이다 라는 의미에요.

내 컴퓨터의 ./data/nginx/pki-validation 경로에 123.txt 파일을 생성하면, nginx 도커 컨테이너 내의 /usr/share/nginx/html/.well-known/pki-validation 경로에 123.txt가 생기는거죠~

따라서 이렇게 볼륨을 설정하시고, (호스트 파일 시스템 경로는 자유롭게 환경에 맞게 자유롭게 설정해주시면 됩니다.)

본인의 호스트 파일 시스템 경로에 아까 다운로드 받은 인증 파일을 넣고, 도커를 컨테이너들을 재실행 한 다음 ZeroSSL 홈페이지 내에서 인증받기 버튼을 누르고 성공하면 인증서를 적용할 수 있는 파일을 다운로드 받을 수 있게 해줍니다! 와!

2. 인증서 적용하기

이제 다음 사진과 같은 절차에 접어들어셨을텐데요!

Server Type을 고를 수 있는데, 저는 nginx로 했습니다! (Default Format으로 하셔도 아마 문제 없으실거에요)

그 다음 인증서를 다운로드 받아주세요. (Download Certificate)

그 다음 압축을 풀면

ca_bundle.crt / certficate.crt / private.key 세 파일이 있습니다.

여기서 한번 편집을 해줘야해요.

ca_bundle.crt의 내용을 전부 복사해서, certficate.crt의 맨 끝에 붙여 넣기 해주시고 저장해주세요.

이렇게 👇

-----BEGIN CERTIFICATE-----
어쩌고 저쩌고
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
어쩌고 저쩌고 from ca_bundle.crt
-----END CERTIFICATE-----

이 작업이 완료됬으면 이제 추가적인 nginx 설정과, 인증서를 옮겨주시면 되는데요!

우선 이 인증서도 nginx 도커 컨테이너 내부에 주입(?) 해주셔야합니다.

  nginx:
    build: ./data/nginx
    ports:
      - "80:80"      
      - "443:443"
    restart: always  
    volumes:
      - ./data/nginx/pki-validation:/usr/share/nginx/html/.well-known/pki-validation
      - ./data/nginx/ssl:/etc/ssl/mydomain.com

아까 pki-validation과 같은 원리입니다.

저는 /etc/ssl/mydomain.com 경로에다가 위치 시켰어요.

이것까지 해줬으면 이제 nginx 설정 파일 건드는것만 남았어요. 저의 nginx 설정 파일 일부는 다음과 같습니다. (SSL 관련만)

server {
    listen 80 default_server;

    server_name yourdomain.co.kr;

    server_tokens off;

    location /.well-known/pki-validation/ {
        alias /usr/share/nginx/html/.well-known/pki-validation/;  # 도메인 검증 파일이 위치하는 실제 경로로 변경
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen  443 ssl;
    server_name yourdomain.co.kr;

    ssl_certificate /etc/ssl/yourdomain.co.kr/certificate.crt;
    ssl_certificate_key /etc/ssl/yourdomain.co.kr/private.key;

    ......
    ......
    ......


}

여기서 핵심은

server {
    listen  443 ssl;
    server_name yourdomain.co.kr;

    ssl_certificate /etc/ssl/yourdomain.co.kr/certificate.crt;
    ssl_certificate_key /etc/ssl/yourdomain.co.kr/private.key;

    ......
    ......
    ......

이 블록을 추가하는 것이에요.. nginx를 공부해보질 않아서 잘 모르지만
SSL을 적용하려면 꼭 추가해줘야하는 블록으로 이해를 하고 있어요.

그 다음 ssl_certificate, ssl_certificate_key 는 각각 certificate.crt 와
private.key 가 있는 경로를 설정해주시면 됩니다!

이제 도커 컨테이너들을 다시 실행시키고 도메인에 들어가보시면

이렇게 자물쇠가 걸려있는걸 보실 수 있을겁니다! ( 저의 경우 이렇게 했어요 ! )

도커도, nginx도 잘 모르는 상태에서 적용하고 부랴부랴 포스팅하는거라 이해가 잘 안될 수 있지만 도움이 됬으면 좋겠네요~

  • 유의점 : 갱신 주기맞춰서 다시 해줘야해요!

profile
🧑‍💻

0개의 댓글