BackEnd/Infra

Certbot을 사용한 Nginx SSL 인증서 등록 및 자동 갱신 설정 방식

PgmJUN 2024. 11. 28. 13:42

 

 

설정 이유

기존에 인증서 흭득에 사용했던 certbot standalone 방식은 80번 포트에 직접 "독립형" 웹서버를 사용하여 인증서를 갱신하는 방식이다.

하지만 Nginx같이 80번 포트를 사용하는 웹서버가 떠있는 경우 사용이 불가능하다.

이전에는 Nginx를 사용하지 않아 standalone을 적용했지만, 이제는 Nginx를 사용하는 환경이기 때문에 다른 설정이 필요해졌다.

 

 

사전 작업

 

1. Gabia DNS 설정

땅콩 서비스는 도메인 주소를 Gabia에서 구매했기 때문에 Gabia에서 설정을 건드리게 됐다.

DNS 관리툴에 들어가서 DNS 설정을 클릭한다.

 

Gabia - DNS 관리툴 - DNS 설정

그리고 A 레코드 : 서브 도메인 : EC2 IPv4 주소 를 입력해서 기본 설정을 수행한다.

 

2. Nginx 설치

sudo apt-get update
sudo apt-get install nginx

apt-get update 후 Nginx 설치

 

Nginx 연결 설정

sudo vi /etc/nginx/sites-available/default

default 파일에 연결 설정 수행

 

설정 전) /etc/nginx/sites-available/default

server {
        listen 80; 
        location / { 
                return 302 https://$host$request_uri;
        }
}

server {
        listen 443;
        server_name your_domain; # 본인의 도메인 주소 설정

        location / { 
                proxy_pass <http://127.0.0.1:8080>;  # 8080번 포트로 요청 전달
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

위와 같이 기본 설정을 수행

 

 

설정 과정

 

1. certbot 설치

sudo apt-get install python3-certbot-nginx

nginx 인증서 흭득이 가능한 certbot을 설치

 

2. 인증서 흭득

certbot Nginx를 통해 인증서를 얻고 설정

# nginx를 사용해서 인증서를 관리하는 nginx certbot
sudo certbot --nginx

nginx를 사용하는 인증서 등록 명령어이다.

해당 명령을 입력하면 ssl 인증서 관련 알림을 받을 'Email' , SSL 설정을 수행할 '도메인 주소'를 입력하라고 한다.

 

잘 입력해주면 관련 설정은 끝난다.

 

만약 Rollback이 필요하다면?

sudo certbot --nginx rollback --nginx

공식 문서에서는 설정을 되돌릴 수 있는 롤백 명령어도 제공한다.

만약 Nginx default 파일의 설정이 예상과 다르게 망가진 경우 사용하면 좋을 것 같다.

 

설정 후) /etc/nginx/sites-available/default

server {
        listen 80;

        return 302 https://$host$request_uri;
}

server {
				listen 443 ssl; # managed by Certbot
        server_name your_domain;

        ssl_certificate /etc/letsencrypt/live/api.dev.ddangkong.kr/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/api.dev.ddangkong.kr/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot     

        location / {
                proxy_pass <http://127.0.0.1:8080>;  # 8080번 포트로 요청 전달
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

자동 설정 후에 내가 조금 조정해준 default 파일(기본 서버 블록 설정 파일)이다.

웬만한 경우, 이대로 사용하면 문제없이 사용할 수 있을 것이다.

 

3. HTTPS 정상 동작 확인

설정 이후에는 위와 같이 https 요청이 정상적으로 수행된다.

 

 

인증서 자동 갱신 설정

User Guide — Certbot 3.1.0.dev0 documentation

공식 문서를 보면 SSL 인증서 갱신을 자동화시킬 수 있는 방안도 제시하고 있다.

바로 인증서 renew 명령어와 crontab 을 활용한 방안이다.

 

1. cron 설정 명령

SLEEPTIME=$(awk 'BEGIN{srand(); print int(rand()*(3600+1))}'); echo "0 0,12 * * * root sleep $SLEEPTIME && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

위 명령은 공식문서에서 제공한 crontab 설정 명령어이다.

 

/etc/crontab

위 명령을 쉘에 입력하면 다음과 같이 자동으로 crontab 설정이 완료된다.

 

왜 0~3600초를 랜덤하게 대기하고 실행하는 지는 잘 모르겠다만 아마도 하나의 인증서를 여러 서버에서 갱신하는 경우 Rate Limit에 의해 갱신 요청 수가 초과되어 갱신이 되지 않는 문제를 막기 위함일까 싶다.

 

2. cron 재시작

sudo systemctl restart cron
sudo systemctl status cron

정상적으로 동작하도록 해주기 위해 cron을 재시작한다.

여기까지 완료되었다면 문제없이 지속적으로 HTTPS 통신을 이용할 수 있다.