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