Let's Encrypt & Certbot

HelloPong·2025년 8월 16일

공부

목록 보기
23/39
post-thumbnail

🔒 Let’s Encrypt (LE)

무엇인가?

  • 공개·비영리 인증기관(CA).
  • 누구나 무료로 도메인 검증(DV) 인증서를 발급받아 HTTPS(SSL/TLS) 를 적용할 수 있게 해줘요.
  • 유효기간 90일(짧게 유지해 자동 갱신을 권장 → 보안성↑).

어떻게 동작하나? (ACME 프로토콜)

  1. ACME 클라이언트(예: Certbot)가 LE 서버에 “이 도메인 내 것 맞아?”라고 요청
  2. LE가 챌린지를 제시
    • HTTP-01: http://<도메인>/.well-known/acme-challenge/...에 토큰 파일 올려 검증
    • DNS-01: 도메인 TXT 레코드에 토큰 추가(와일드카드 *.example.com 발급 시 이 방식 필수)
    • TLS-ALPN-01: 443에서 ALPN으로 검증(특수 케이스)
  3. 검증 OK → 인증서(공개키)와 체인 발급
  4. 주기적 갱신(renew) 필요(보통 만료 30일 전부터 자동)

발급 형태/제한

  • DV 인증서만 발급(OV/EV 미발급).

  • 와일드카드: *.example.com은 DNS-01 챌린지로만 가능.

  • 키 타입: RSA(일반적), ECDSA도 가능(경량/성능 유리).

  • 주요 레이트 리밋(대표적 예)
    - 등록 도메인당 주당 인증서 50개
    - 동일한 SAN 세트 중복 인증서 주당 5개
    - 검증 실패: 호스트명·계정 기준 시간당 5회
    - Pending Authorizations: 계정당 300개 내외 (운영 전 Staging 환경으로 리밋/실패 리스크 줄이는 게 정석)

    체인/호환성

  • 기본 루트는 ISRG Root X1 체인을 사용(현대 브라우저/OS 대부분 신뢰).

  • 서버는 OCSP Stapling 권장(상태검사 성능/프라이버시 개선).

언제 LE를 쓰고, 언제 다른 걸 쓰나?

  • 일반 서버/컨테이너 직접 TLS → LE가 최고 효율(무료+자동).
  • AWS ALB/CloudFront에서 TLS 종료 → ACM(AWS) 쓰는 게 편하고 안정적.
  • Caddy/Traefik 같은 리버스 프록시 → 자체적으로 LE/ZeroSSL 자동 발급을 내장. (Caddy 쓰면 보통 Certbot 불필요)

🧰 Certbot

무엇인가?

  • Let’s Encrypt용 ACME 클라이언트이자 자동화 도구.
  • 한 줄 명령으로 발급·설치·갱신까지 처리하고, 웹서버 설정(Nginx/Apache)도 플러그인으로 자동 패치.

설치(예: Ubuntu)

sudo apt update
# Nginx 연동 예시
sudo apt install -y certbot python3-certbot-nginx
# Apache면 python3-certbot-apache

핵심 사용 패턴

1) 웹서버 플러그인 방식 (가장 쉬움)

# Nginx 설정을 자동 수정 + 인증서 자동 발급/설치
sudo certbot --nginx -d example.com -d www.example.com
  • Certbot이 임시 서버블록을 구성해 HTTP-01 검증 → 성공 시 HTTPS 서버블록/HSTS 등 자동 반영.

2) 웹루트(webroot) 방식 (정석·안정)

sudo certbot certonly --webroot \
  -w /var/www/html \
  -d example.com -d www.example.com
# 발급 후 nginx.conf에서 /etc/letsencrypt/live/<도메인>/ 경로를 수동 설정
  • 기존 Nginx가 80을 점유 중이어도 .well-known/acme-challenge 로 파일만 배치하면 검증 가능.

3) DNS-01 (와일드카드·프록시 환경)

# 예: Cloudflare DNS 플러그인
sudo apt install -y python3-certbot-dns-cloudflare
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
  -d example.com -d '*.example.com'
  • Cloudflare “프록시(🟧 구름)”가 켜져 있어도 OK(HTTP-01은 프록시가 방해할 수 있으나, DNS-01은 안전).

파일/디렉터리 구조 (중요)

/etc/letsencrypt/
  live/<도메인>/      # 실제 웹서버가 참고할 심볼릭 링크
    fullchain.pem     # 서버 인증서 + 체인
    privkey.pem       # 개인키(권한 600/소유 root)
  archive/<도메인>/   # 과거 버전까지 저장
  renewal/<도메인>.conf # 갱신 설정
/var/log/letsencrypt/  # 발급/갱신 로그

갱신(renew)

  • 설치 시 보통 systemd timer 또는 cron이 자동 등록.
  • 수동 점검:
sudo certbot renew --dry-run     # 리허설
sudo systemctl list-timers | grep certbot
  • 갱신 후 웹서버 자동 재적용(핫 reload) 훅:
sudo certbot renew --deploy-hook "systemctl reload nginx"
# Docker 환경이면:
sudo certbot renew --deploy-hook "docker compose exec nginx nginx -s reload"

기타 유용한 명령

sudo certbot certificates        # 보유 인증서 목록
sudo certbot revoke --cert-name example.com   # 인증서 폐기
sudo certbot delete --cert-name example.com   # 로컬 삭제
# ECDSA 키로 발급(가벼움/성능 Good)
sudo certbot --nginx --key-type ecdsa --elliptic-curve secp384r1 -d example.com
# Staging(리밋/실패 부담↓)에서 테스트
sudo certbot --nginx --staging -d example.com

트러블슈팅 베스트 프랙티스

  • 80/443 포트 개방: 보안그룹/방화벽에서 인바운드 허용(EC2라면 SG에서 80/443).
  • Cloudflare 프록시(🟧): HTTP-01 검증 땐 일시 해제하거나 DNS-01로 전환.
  • 포트 점유: Standalone 모드(–standalone)는 80/443 바인딩 필요 → 기존 Nginx/Caddy가 있으면 중지하거나 webroot/플러그인 방식 사용.
  • 도메인 A/AAAA 레코드: 서버 공인 IP를 가리키는지 확인(가끔 내부 IP/옛 IP를 바라봄).
  • 권한: privkey.pem 권한은 600, 사용자 노출 금지(Git/이미지 포함 절대 X).

Docker·리버스 프록시·오케스트레이션 팁

  • Nginx+Certbot 컨테이너: /etc/letsencrypt를 볼륨으로 공유해 지속화.
  • Caddy/Traefik: 이미 자동 발급·갱신 내장 → 보통 Certbot 불필요.
  • OpenVidu 같이 자체 TLS를 쓰는 컨테이너: 외부 프록시(Nginx/Caddy)에서 TLS 종료하거나, 발급한 cert를 마운트해 컨테이너 내부에서 사용.

✅ 실전 가이드 (EC2 + Nginx 한 번에)

  1. 보안그룹에 80/443 허용
  2. Nginx 설치 & 기본 서버블록 준비
  3. Certbot 설치
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
  1. 발급 & 자동 설정
sudo certbot --nginx -d example.com -d www.example.com
  1. 갱신 리허설 & 자동 재로드 훅
sudo certbot renew --dry-run
sudo sed -i 's|^renew_hook =.*$||' /etc/letsencrypt/renewal/*.conf 2>/dev/null
sudo certbot renew --deploy-hook "systemctl reload nginx"

🧭 한눈 요약

  • Let’s Encrypt: 무료 CA, ACME로 90일짜리 DV 인증서 발급. 와일드카드는 DNS-01.
  • Certbot: LE용 자동화 툴. 플러그인(Nginx/Apache/DNS)으로 발급·설치·갱신을 원클릭/원커맨드.
  • 현실 운영 팁:
    - 포트/보안그룹/도메인 레코드부터 점검
    - --staging으로 먼저 리허설
    - Docker면 볼륨으로 /etc/letsencrypt 지속화
    - Caddy/ACM 쓰는 아키텍처면 굳이 Certbot 필요 없음

0개의 댓글