[친구하자] SSL 인증서 자동 갱신 설정하기 (Amazon Linux + Let’s Encrypt)

SSH 인증서가 만료되어 이에 대해 공부한 내용과 해결한 내용에 대해 정리했습니다.


문제 상황

프로덕션 환경에서 갑자기 로그인이 안 되는 문제가 발생했다.

GET https://{backend-domain}/api/v1/auth/oauth/kakao/config?platform=web
net::ERR_CERT_DATE_INVALID

에러 이미지1

브라우저 콘솔에 찍힌 에러 메시지를 보니 ERR_CERT_DATE_INVALID - SSL 인증서 날짜가 유효하지 않다는 것이었다.

SSL 인증서란?

SSL(Secure Sockets Layer) 인증서는 웹사이트와 사용자 브라우저 간의 통신을 암호화하는 디지털 인증서이다. HTTPS 통신을 위해서는 반드시 필요하며, 다음과 같은 역할을 한다:

  • 데이터 암호화: 사용자와 서버 간 주고받는 데이터를 암호화
  • 신원 검증: 해당 도메인이 인증된 소유자에 의해 운영됨을 증명
  • 데이터 무결성: 전송 중 데이터가 변조되지 않았음을 보장

특히 OAuth 로그인 같은 민감한 정보를 다루는 경우, 카카오나 구글 같은 OAuth 제공자들은 HTTPS를 필수로 요구한다.

Let’s Encrypt와 90일 갱신 주기

Let’s Encrypt는 무료로 SSL 인증서를 발급해주는 비영리 인증 기관이다. 하지만 한 가지 특징이 있다:

인증서 유효기간이 90일

왜 90일일까?

  1. 보안 강화: 인증서가 탈취되더라도 피해 기간이 짧음
  2. 자동화 유도: 수동 갱신이 번거로워 자동화를 강제함
  3. 키 교체 주기: 정기적인 키 교체로 보안성 향상

일반 상용 인증서는 1년 단위인데, Let’s Encrypt는 무료 대신 짧은 주기로 설정했다. 결과적으로 자동 갱신 설정이 필요했다.

해결 과정

1. 즉시 인증서 갱신

먼저 만료된 인증서를 갱신해서 서비스를 복구했다.

# EC2 서버에 SSH 접속
ssh -i ~/.ssh/your-key.pem ec2-user@{backend-domain}

# 인증서 확인
sudo certbot certificates

에러 이미지2

  • 인증서를 확인하니 어제자로 만료된 것을 확인했다. (오늘은 1월 12일)
# 인증서 갱신
sudo certbot renew

# Nginx 재시작
sudo systemctl reload nginx

2. 자동 갱신 설정

하지만 90일마다 수동으로 갱신할 수는 없다고 생각해, cron을 이용해 자동 갱신을 설정했다.

Amazon Linux에서 cron 설치

# cronie 패키지 설치
sudo yum install cronie

# crond 서비스 시작 및 활성화
sudo systemctl start crond
sudo systemctl enable crond

# 상태 확인
sudo systemctl status crond

주의: Amazon Linux는 cron이 아니라 crond를 사용!

crontab 설정

# root 계정의 crontab 편집
sudo crontab -e

다음 내용을 추가한다:

0 2 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

설정 의미:

  • 0 2 * * *: 매일 새벽 2시에 실행
  • certbot renew: 인증서 갱신 체크 (30일 이내 만료 시 자동 갱신)
  • --quiet: 출력 최소화
  • --post-hook: 갱신 성공 시 Nginx 재시작

저장하고 종료:

i           # 입력 모드
(내용 입력)
ESC         # 명령 모드
:wq         # 저장 후 종료

3. 설정 확인

# crontab 목록 확인
sudo crontab -l

# 갱신 테스트 (실제 갱신 없이 시뮬레이션)
sudo certbot renew --dry-run

--dry-run으로 테스트하면 실제 갱신 없이 프로세스가 정상 작동하는지 확인할 수 있다.

작동 원리

설정 후 시스템은 다음과 같이 동작한다:

  1. 매일 새벽 2시, cron이 certbot renew 실행
  2. certbot이 인증서 만료일 체크
  3. 만료 30일 이내인 경우에만 실제 갱신 진행
  4. 갱신 성공 시 자동으로 Nginx 재시작
  5. 갱신 불필요 시 조용히 종료

즉, 설정만 해두면 완전 자동으로 인증서가 관리된다.

결론

SSL 인증서 만료로 인한 서비스 장애는 치명적이다. 특히 OAuth 인증을 사용하는 서비스에서는 로그인 자체가 불가능해잔다.

Let’s Encrypt를 사용한다면:

  • ✅ cron 자동 갱신 설정은 필수
  • --dry-run으로 정기적으로 테스트
  • ✅ 갱신 실패 시 알림 설정 권장 (이메일 등)

90일마다 수동 갱신하는 것보다, 한 번 제대로 자동화 설정해두는 것이 훨씬 안전하고 편리하다.

참고 자료