

지난주 금요일에 위와같은 Expiration notice 메일을 받았습니다
제목의 certificate Expiration를 보고 Let's Encrpyt로 TLS 인증서를 발급했던 기억이 떠올랐습니다
Let's Encrypt는 TLS 인증서를 무료로 발급해주는 기관입니다.
갱신도 무한하게 할 수 있지만 한번 발급한 인증서의 유효기간은 90일입니다

이전에 갱신한 날짜를 확인했습니다.
10월 26일에 발급했고, 24일에 만료됩니다.
Nginx 설정으로 보안을 위해 Https접속만 허용해둔 상태라 TLS 인증서가 만료되면
FE에서 WAS로 접속할 수 없습니다
따라서 TLS 인증서를 만료시간이 되기 전에 갱신하기로 결정했습니다
TLS 인증서를 갱신하는 과정은 크게 어렵지 않습니다
아래 갱신 명령어를 터미널에 작성하면 됩니다
sudo certbot renew
인증서를 갱신하기 전에 정상적으로 갱신되는지 미리 테스트할 수 있습니다
아래 코드를 작성하면 사전에 테스트할 수 있습니다
sudo certbot renwe --dry-run

위와같이 성공적으로 갱신한다는 결과를 얻었습니다

TLS인증서를 갱신했습니다
갱신이 정상적으로 이루어졌는지 아래 명령어를 통해 확인 가능합니다
sudo certbot certificates

만료 날짜가 4월 22일로 설정되었습니다
정상적으로 인증서가 갱신되었습니다!
처음 한두번 갱신은 괜찮은데, 이 작업을 3개월에 한번씩 진행한다면 불편할 것입니다
그렇다면 자동으로 TLS 인증서를 갱신하는 방법은 없을까요?
간단하게 리눅스의 Cron식을 이용하면 해결할 수 있습니다
sudo crontab -e
위와 같은 명령어로 cron 식을 등록할 수 있습니다

vim나 nano 에디터를 선택해서 파일을 열고 맨 마지막줄에 cron 식을 추가하면 됩니다
0 23 22 * * certbot renew --renew-hook="sudo service nginx restart"
저는 위와같이 cron 식을 설정했습니다
매달 22일 23시마다 갱신을 시도하도록 설정했습니다
사실 Let's Encrypt 인증서는 만료 30일전부터 갱신할 수 있습니다.
따라서 매달 갱신하는 것보다 2달 간격으로 갱신하는게 더 효율적입니다.
하지만 encrpyt인증서를 갱신했을 때 몇초 차이로 cron표현식의 시간과 차이난다면
제대로된 갱신이 이루어지지 않을 것입니다
이럴 경우 이전처럼 수동으로 갱신 해야합니다
자동화의 목적은 수동 갱신을 최대한 피하기 위함입니다.
따라서 매달 갱신 요청을 하는 것으로 cron식을 세워서
발생할 수 있는 문제를 회피하도록 설정했습니다
앞서 설정한 Cron 서비스가 제대로 동작하는지 확인했습니다.
다음과 같은 명령어로 실행 상태를 확인할 수 있습니다
sudo systemctl status cron

확인했을 때, 정상적으로 동작하고 있습니다!
이제 백그라운드에서 동작하면서 Cron식에 따라 인증서 갱신을 시도합니다
참고로 Cron 서비스는 디렉토리에 저장되기 때문에, EC2를 재시작해도 정상작동합니다
만약 제거하고 싶다면 아래와 같은 명령어를 입력해야합니다
sudo crontab -r
현재 사용하고 있는 Https의 보안 점수를 확인할 수 있습니다

BE 서버의 HTTPS 인증서 보안점수는 A입니다
A로는 조금 아쉽습니다. 최고 등급인 A+ 등급을 받고 싶습니다
현재설정에서 A+ 등급을 받으려면 HSTS설정이 필요합니다
HSTS(HTTP Strict Transport Security)는 HTTPS로만 웹사이트에 접속하도록 강제하는 기술입니다
처음 웹사이트에 접속할 때, HTTP로 요청하면 서버에서는 Redirect해서 https로 응답합니다.
이때 중간자 공격으로 http 패킷을 하이재킹해서 사용자의 정보를 확인할 수 있습니다
따라서 https만을 위한 서비스를 만든다면, 위와같은 문제를 막기 위해 HSTS를 설정하는 것이 권장됩니다
Nginx에서 HSTS를 설정하는 방법은 간단합니다
add_header Strict-Transport-Security "max-age=31536000" always;
위와같은 설정을 추가하면 됩니다.
위 설정은 1년동안 HSTS 설정을 적용한다는 의미입니다

https 응답을 받은 경우 HSTS에서 설정한 기간동안 HTTPS로만 접속합니다
만약 HTTP로 접속한다면, 307 상태코드와 함께 HTTPS가 적용된 응답을 재전송합니다

HSTS를 적용하고 재평가했을 때, A+등급을 받았습니다!