🐧 Linux, shell, web server/📗 Nginx

certbot를 활용한 https 인증서 발급 및 cron 설정

DarrenKwonDev 2021. 2. 1. 07:28

certbot.eff.org/docs/

 

Welcome to the Certbot documentation! — Certbot 1.11.0.dev0 documentation

 

certbot.eff.org

 

AWS ACM 사용해도 되긴 하는데 솔직히 AWS console 세팅이 더 복잡하고 손이 많이 갑니다.

greenlock-express은 불안정하고, 무엇보다 프로젝트가 관리가 안되고 있습니다.

 

다음과 같이 구성할 예정입니다.

 

 

1. certbot 설치

실무적인 cerbot 설치 과정은 아래 사이트에서 편하게 확인할 수 있다.

certbot.eff.org/lets-encrypt/snap-nginx

 

Certbot - Snap Nginx

a project of the Electronic Frontier Foundation certbot instructions To use Certbot, you'll need... comfort with the command line command line ...and an HTTP website HTTP website that is already online already online with an open port 80 port 80 ...which i

certbot.eff.org

 

certbot은 Let’s Encrypt 인증서를 자동으로 발급/갱신해주는 봇입니다.

letsencrypt를 받아서 세팅할 수도 있긴 하지만 certbot을 사용하는게 편합니다.

 

우선 프로젝트 소스 코드가 있는 경로로 이동하여 설치합시다.

 

* certbot을 wget으로 설치시 Skipping bootstrap because certbot-auto is deprecated on this system. 에러를 만날 수 있습니다. certbot을 실행하면 자동으로 certbot 업데이트도 진행하는데 1.11 버전부터 wget으로 cerbot을 설치할 시 이런 에러를 만날 수 있습니다. 에러 문구에 안내된 경로를 살펴보면 snapd을 이용해서 설치하라고 권고하고 있다.

만약 이미 wget을 통해 설치한 후 이 에러를 만났다면 반드시 기존에 설치된 certbot을 삭제한 후 snapd를 이용해 설치하자.

sudo apt-get remove certbot
sudo dnf remove certbot
sudo yum remove certbot

 

(1) snapd 설치

sudo apt-get update && sudo apt-get install snapd
sudo snap install hello-world // 정상적으로 설치되어 작동하는지 확인
sudo snap install core; sudo snap refresh core // 최신 버전인가 확인

 

(2) certbot 설치

sudo snap install --classic certbot // certbot 설치
sudo ln -s /snap/bin/certbot /usr/bin/certbot // certbot 명령어 실행을 위해 심볼릭 링크

 

nginx 관련 설정도 자동으로 구성하기 위해 아래 명령어를 사용합시다.

sudo certbot --nginx // Certbot edit your Nginx configuration automatically to serve it
sudo certbot certonly --nginx // 단순히 인증서만 받아오기

도대체 무엇은 자동으로 구성해주느냐? 인증서 세팅을 마친 후 /etc/nginx/sites-available/default 를 확인해보면 다음과 같은 부분이 443 포트 부분에 추가된 것을 확인할 수 있습니다.

listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/[도메인]/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/[도메인]/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

 

 

* 만약 cerbot 명령어가 실행되지 않는다면 해당 명령어 실행 권한을 열어둡시다.

chmod a+x certbot-auto // all 유저에게 execute 권한 부여

 

이제 인증서 등록을 위한 간단한 절차만 밟으면 끝납니다.

이메일과 도메인만 입력하면 끝납니다.

이메일은 여러분들이 자주 사용하는 이메일을 적는 것이 좋습니다. 인증서 만료가 가까워지면 메일로 알려주기 때문입니다. 물론 갱신 작업을 cron job에 물리는게 좋죠 신경 안 쓰게.

 

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator nginx, Installer nginx

Enter email address (used for urgent renewal and security notices)

(Enter 'c' to cancel): [여러분의 이메일]

 

No names were found in your configuration files. Please enter in your domain

name(s) (comma and/or space separated) (Enter 'c' to cancel): [여러분들이 구매한 도메인. fuze.com 같이 입력]

 

Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/default

Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/default

 

Congratulations! You have successfully enabled https://fuze.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Subscribe to the EFF mailing list (email: [여러분의 이메일]).

 

 

인증서를 발급 받으면 중요한 정보라며 다음과 같은 정보를 알려줍니다.

인증서와 체인, 비밀키가 저장된 경로를 알려주네요.

 

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at:

/etc/letsencrypt/live/[도메인]/fullchain.pem

 

Your key file has been saved at:

/etc/letsencrypt/live/[도메인]/privkey.pem

 

Your certificate will expire on 2021-05-01. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option.

To non-interactively renew *all* of your certificates, run "certbot renew"

 

이제 https로 여러분들의 웹에 접속할 수 있게 되었습니다!

 

 

 

2. 80 포트 접속시 443 포트로 redirect 처리하기

이미 Certbot이 해줬는데 이 녀석이 제대로 작동을 안합니다.

/etc/nginx/sites-available 부분을 살펴보면 아래와 같이 되어 있습니다. return 404제거하고 301로 바꿔줬습니다.

server {
    if ($host = fuze.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
    
    listen 80 ;
    listen [::]:80 ;
    server_name fuze.com;
    return 404; # managed by Certbot // 이거 제거하고
    return 301 https://$host$request_uri; // 이걸로 교체
}

 

 

3. cron 구성으로 renew 주기적 실행

 

우선 갱신이 성공적으로 이루어질 수 있는지는 체크해보겠습니다.

실제 서비스 중인 웹앱에서 제대로 갱신이 되지는지 체크하지 않고 renew를 진행하다 실패한다면, 해당 문제를 고칠 때까지 443 포트로 접근하지 못할 수도 있겠죠...

certbot renew --dry-run

 

dry run이 성공적으로 이루어졌다면 certbot renew를 통해 인증서를 갱신해줄 수 있습니다.

이 작업을 3개월마다 수작업으로 해줘야 하는거죠.

 

이 작업을 2달마다 실행하도록 cron을 짜겠습니다. 3개월 마다 실행하다가 괜히 몇 시간 비는 것보다 매달 갱신시켜주는 것이 좋다고 판단했습니다.

 

crontab -e // 크론 생성, 편집
crontab -l // 기존 크론 목록 조회
crontab -r // 크론 삭제
0 0 1 * * certbot renew --renew-hook "sudo service nginx restart"

 

다른 주기로 cron을 실행시키고 싶다면 아래를 참고해봅시다.

 

crontab.guru/

 

Crontab.guru - The cron schedule expression editor

loading... Cron job failures can be disastrous! We created Cronitor because cron itself can't alert you if your jobs fail or never start. Cronitor is easy to integrate and provides you with instant alerts when things go wrong. Learn more about cron job mon

crontab.guru

 

참고한 영상)

www.youtube.com/watch?v=NfzjQBvUIXM&ab_channel=JohnAhn

www.youtube.com/watch?v=6TYwnURF09w&ab_channel=ZeroChoTV

 

 

좋은 글)

devlog.jwgo.kr/2019/04/16/how-to-lets-encrypt-ssl-renew/

https://www.dazzii.com/lets-encrypt-wildcard-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%B0%9C%EA%B8%89/

https://extrememanual.net/10030

https://extrememanual.net/2059

https://blog.lael.be/post/5107

riseshia.github.io/2016/10/16/certbot-let-s-encrypt.html