본문 바로가기
AWS

Docker 이용해서 Let's Encrypt 인증서 발급 받기 (https 설정)

by Zih0 2021. 9. 9.

도메인 주소 발급

먼저 ssl 인증서를 발급 받기 위해선 도메인 주소를 얻어야 합니다.
무료로는 freenom (https://www.freenom.com/) 을 추천드리고, 유료는 AWS Route 53을 추천드립니다.
(왜냐면 제가 두 곳만 써봤습니당.하하)

Let's Encrypt 인증서 발급

도메인 주소를 받았으면 배포한 서버에 접속해서 아래와 같이 입력합니다.
도메인 주소라고 적힌 부분에는 본인의 도메인 주소를 넣어주면 됩니다. ex) ziho.com

docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d '도메인 주소' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

(도커를 사용하기 때문에, 서버에 도커가 설치되어 있어야 합니다.)

위의 명령어를 입력하면 아래와 같이 DNS 레코드를 입력하라는 문구가 뜹니다.
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ad8d7405-2065-4f62-8a67-bf0a76888500/_2021-04-22__3.49.41.png

DNS 레코드 입력

예시로는 freenom 사이트를 사용했기에 freenom 기준으로 보여드리겠습니다.
Name에 _acme 부분을 넣고 Type에는 TXT, Target은 문구에서 제시해준 값을 넣어줍니다.
(사진에선 A type을 TXT로 안고쳤는데, TXT로 진행했습니다.)
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/538f2410-545b-43b2-9838-6b3a2db618fc/_2021-04-22__3.49.36.png

터미널에서 아래 명령어를 통해 DNS 설정이 적용되었는지 확인합니다. freenom은 이 과정에서 시간이 몇 분 걸립니다.
(aws는 유료라 그런지 1분 미만으로 설정이 적용됩니다.)

nslookup -type=txt _acme-challenge.도메인 주소

그리고 확인이 된 후에는 서버로 돌아가서 엔터를 눌러줍니다!

그러면 ssl 인증서 발급이 완료됩니다.

경로는 아래와 같습니다.

  /etc/letsencrypt/live/도메인 주소/fullchain.pem; # managed by Certbot
  /etc/letsencrypt/live/도메인 주소/privkey.pem; # managed by Certbot

발급받은 ssl 인증서를 nginx를 통해 적용하기

/etc/nginx/sites-available/프로젝트.conf 파일을 생성합니다.
그 다음엔 sites-available 폴더의 파일을 sites-enabled에 연결해서 생성시켜줍니다.

sudo ln -s /etc/nginx/sites-available/프로젝트.conf /etc/nginx/sites-enabled

sites-available 폴더에서 생성한 conf 파일을 수정하면, enabled 폴더의 파일도 수정이 됩니다.

그리고 아래와 같이 작성해줍니다.
설명을 드리면, http로 접속하면 https로 Redirect되게 적용했고,
https 부분에서 ssl을 연결시켜주었습니다.

        server {
                server_name 도메인주소 www.도메인주소;
                return 301 https://도메인주소$request_uri;
        }

        server {
                listen 443 ssl;
                server_name 도메인주소;
                ssl_certificate /etc/letsencrypt/live/도메인주소/fullchain.pem; # managed by Certbot
                ssl_certificate_key /etc/letsencrypt/live/도메인주소/privkey.pem; # managed by Certbot
                location / {
                        proxy_set_header Host $host;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Proto $scheme;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection "upgrade";
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_pass http://127.0.0.1:8001;
                        proxy_redirect off;

               }
       }

댓글