본문 바로가기

WEB

SSL/TLS 인증서 발급 - Let's Encrypt 적용 방법

간만에 새 글을 쓰는 것 같다.

오늘은 Let's Encrypt를 통해 SSL 인증서를 사용하는 방법을 알아보자.

 

개인프로젝트를 개발하다가 HTTPS를 적용해야하는 일이 생기게 되었다.

당연하게도 HTTPS를 적용하려면 SSL 인증서가 필요하고, 여러 브라우저에서 차단되지 않으려면 공인된 CA (Certificate Authority, 인증 기관)에서 인증서를 생성해야한다.

 

공인된 CA는 여럿 존재하나 오늘은 돈을 들이지 않고 무료로 SSL 인증서를 사용할 수 있는 Let's Encrypt에 대해 기술해보겠다. 과정은 단계별로 설명하겠다.

 

0. 호스팅 서버 준비 & 도메인 설정

HTTPS를 적용하려면 SSL 인증서를 적용하려는 서버 (ex. AWS EC2 인스턴스 등)이 준비되어있어야 한다.

해당 포스팅에서는 AWS EC2를 사용하였고, 도메인 설정은 AWS Route53 서비스를 사용하였다.

도메인은 example.com 이라고 가정하겠다.

 

그리고 EC2를 사용할 경우 보안그룹을 수정하여 인바운드 포트 80이나 443을 모든 IPv4에 대해 열어주자.

certbot은 인증서 발급 시 도메인 소유권을 인증하기 위해 별도의 임시 웹서버를 생성하여 외부 API와 소통하기 때문이다.

만약 발급 도중 타임아웃이 난다면 60%는 이 문제이다. 인바운드를 열어주고 재시도하면 대부분 해결된다.

 

자세한 준비 과정은 생략한다.

 

1. Certbot 설치

sudo yum install certbot

위의 명령어로 certbot을 설치할 수 있다. 참 쉽죠?

 

2. 인증서 발급

certbot을 사용하여 standalone으로 사용할 인증서를 발급하려면 아래 명령어를 입력한다.

만약 Route53으로 연결한 도메인일 경우 --standalone이 아닌 --manual --preferred-challenges dns를 통해 DNS 방식으로 인증서를 생성할 수 있다.

예를 들어 S3 도메인 URL (ex. ~s3.ap-northeast-2.~)로 등록된 Route53의 도메인으로 인증할 경우 TXT 레코드로 인증할 수 있다.

certbot certonly --standalone -d example.com

물론 example.com 대신 자신이 사용하는 도메인을 적는 것을 잊지 않도록 한다.

실제 실행결과는 아래와 같다. 민감할 수 있는 부분은 가렸다.

[ec2-user@ip-??-??-??-?? ???]$ sudo certbot certonly --standalone -d example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): <blinded>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Account registered.
Requesting a certificate for example.com
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Subscribe to the EFF mailing list (email: ?).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your certificate will expire on 2023-10-04. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 

3. 인증서 자동 재발급 설정

부가적인 설정이지만 인증서 만료를 고려하여 만료 전 자동으로 재발급을 하는 자동 시스템을 설정할 수 있다.

당연하게도 Let's Encrypt가 무료 인증서인만큼, 만료까지의 기간이 굉장히 짧다. (약 3개월)

certbot이 자동 갱신을 지원하진 않지만, cron 작업을 통해 자동으로 갱신하게 할 수 있다.

 

우선 갱신 명령어가 잘 실행되는지부터 확인해보자.

sudo certbot renew --dry-run

이 명령어가 잘 실행되면 갱신은 ok다.

 

linux에서는 cron job을 지원하는데, 지원되지 않는 OS 사용 시 대체 모듈을 사용하기 바란다.

sudo crontab -e

위의 명령어를 실행하면 cron 작업을 설정할 수 있는 파일이 열리는데, 아래의 구문을 입력한다.

0 */12 * * * certbot renew --quiet

위의 명령어는 12시간마다 certbot에게 갱신을 하게 만드는 명령어로, 반복되다가 만료 기한 30일전부터 실행 시 갱신이 될 것이다. certbot은 갱신할 수 있는 날짜가 아닌 경우에는 알아서 갱신을 안하기 때문에, 자주 반복해도 상관 없다.

 

만약 자동화를 해두었어도, 이후 인증서 만료 오류가 발생한다면, 서버에서 사용하는 키가 업데이트되지 않았을 확률이 높다.

(내가 그랬기 때문..)

예를 들면 서버에서 cert.pem과 key.pem을 load하여 서버를 TLS로 여는 방식으로 켜두었다면 실제로 certificate 파일을 업데이트하더라도 서버는 기존에 사용하던 인증서 파일을 사용하므로 인증 만료가 발생하는 것이다.

이러한 경우에는 서버에서도 스케쥴러로 업데이트된 키파일을 자동으로 적용하게 만들거나 직접 적용 후 재시작해야할 것이다.

 

4. 적용

적용은 서버마다 다를 수 있기 때문에 자신의 서비스 프레임워크에 맞는 방법을 사용한다.