본문 바로가기
Infra2024년 4월 28일6분 읽기

Let's Encrypt 자동 갱신 완벽 설정 — Nginx + Certbot

YS
김영삼
조회 319

Let's Encrypt와 Certbot 소개

Let's Encrypt는 무료 SSL/TLS 인증서를 발급하는 인증 기관(CA)입니다. Certbot은 Let's Encrypt 인증서의 발급과 갱신을 자동화하는 공식 클라이언트 도구입니다. 인증서 유효 기간이 90일이므로, 자동 갱신 설정은 필수입니다.

Certbot 설치

# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx

# CentOS/RHEL
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx

인증서 발급

Nginx 플러그인 사용 (권장)

Certbot Nginx 플러그인은 인증서 발급과 동시에 Nginx 설정까지 자동으로 수정해 줍니다.

# 단일 도메인
sudo certbot --nginx -d example.com -d www.example.com

# 비대화형 모드 (자동화 스크립트용)
sudo certbot --nginx --non-interactive --agree-tos \
  --email admin@example.com \
  -d example.com -d www.example.com

Webroot 방식

Nginx 플러그인을 사용할 수 없을 때, webroot 방식으로 인증서를 발급할 수 있습니다.

# Nginx에서 .well-known 경로 설정
# /etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
    root /var/www/certbot;
    default_type "text/plain";
}

# 인증서 발급
sudo certbot certonly --webroot \
  -w /var/www/certbot \
  -d example.com -d www.example.com

Nginx SSL 설정

Certbot이 자동 생성하는 설정을 기반으로, 보안 강화를 위해 몇 가지 옵션을 추가합니다.

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

자동 갱신 설정

Certbot은 설치 시 자동으로 systemd timer 또는 cron job을 생성합니다. 하지만 갱신 후 Nginx 재시작이 포함되어야 합니다.

systemd timer 확인

sudo systemctl status certbot.timer
sudo systemctl cat certbot.timer

갱신 후 Nginx 리로드 훅

# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
echo "$(date): Nginx reloaded after cert renewal" >> /var/log/certbot-deploy.log

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh

수동 갱신 테스트

sudo certbot renew --dry-run
sudo certbot renew --force-renewal

인증서 모니터링

sudo certbot certificates

openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | \
  openssl x509 -noout -dates

트러블슈팅

  • 포트 80 점유 문제: standalone 모드 사용 시 Nginx를 잠시 중지하거나, webroot/nginx 플러그인을 사용하세요.
  • Rate Limit: 도메인당 주 50회 발급 제한이 있으므로, 테스트 시 --staging 플래그를 사용하세요.
  • 와일드카드 인증서: DNS-01 챌린지가 필요하며, DNS API를 지원하는 플러그인 설치가 필요합니다.
  • 갱신 실패 알림: certbot renew 결과를 이메일이나 Slack으로 전송하는 스크립트를 추가하세요.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록