Certbot으로 Let’s Encrypt SSL 인증서 발급하기




무료 SSL 인증서의 대명사 Let’s Encrypt. 이 글에서는 Certbot을 사용해 SSL 인증서를 발급받는 다양한 방법을 정리합니다.

Let’s Encrypt와 Certbot 소개

Let’s Encrypt는 비영리 기관 ISRG(Internet Security Research Group)에서 운영하는 무료 SSL/TLS 인증서 발급 서비스입니다. Certbot은 Let’s Encrypt 인증서를 쉽게 발급하고 관리할 수 있게 해주는 공식 클라이언트 도구입니다.

주요 특징

  • 완전 무료
  • 자동 갱신 지원
  • 90일 유효기간 (자동 갱신으로 관리)
  • 와일드카드 인증서 지원
  • 다양한 검증 방식 제공

Certbot 설치

Ubuntu/Debian

sudo apt update
sudo apt install certbot

# Nginx 플러그인 (선택)
sudo apt install python3-certbot-nginx

# Apache 플러그인 (선택)
sudo apt install python3-certbot-apache

CentOS/RHEL

sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx

macOS

brew install certbot

인증서 발급 방식 비교

Certbot은 도메인 소유권을 검증하는 여러 방식을 제공합니다.

방식장점단점적합한 환경
Webroot서버 중단 없음웹서버 필요운영 중인 웹서버
Standalone간단함80포트 점유 필요웹서버 없는 환경
Nginx/Apache자동 설정플러그인 필요해당 웹서버 사용 시
DNS와일드카드 지원수동 작업내부망, 와일드카드

방식별 발급 방법

1. Nginx 플러그인 방식 (가장 간편)

Nginx를 사용 중이라면 가장 추천하는 방식입니다. 인증서 발급과 Nginx 설정을 자동으로 처리합니다.

# 인증서 발급 + Nginx 자동 설정
sudo certbot --nginx -d example.com -d www.example.com

# 인증서만 발급 (설정은 수동)
sudo certbot certonly --nginx -d example.com

2. Apache 플러그인 방식

sudo certbot --apache -d example.com -d www.example.com

3. Webroot 방식

이미 웹서버가 실행 중이고, 문서 루트 디렉토리에 접근 가능할 때 사용합니다.

sudo certbot certonly --webroot \
  -w /var/www/html \
  -d example.com \
  -d www.example.com

Nginx 설정 예시 (/.well-known/acme-challenge/ 경로 허용)

location /.well-known/acme-challenge/ {
    root /var/www/html;
}

4. Standalone 방식

웹서버 없이 Certbot이 임시로 80포트를 사용하여 검증합니다.

# 웹서버가 실행 중이라면 먼저 중지
sudo systemctl stop nginx

# 인증서 발급
sudo certbot certonly --standalone -d example.com

# 웹서버 재시작
sudo systemctl start nginx

5. DNS 방식 (Manual)

DNS TXT 레코드를 직접 추가하여 검증하는 방식입니다. 와일드카드 인증서는 이 방식만 가능합니다.

# 단일 도메인
sudo certbot certonly --manual \
  --preferred-challenges dns \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  -m your-email@example.com \
  -d example.com

# 와일드카드 인증서
sudo certbot certonly --manual \
  --preferred-challenges dns \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  -m your-email@example.com \
  -d example.com \
  -d "*.example.com"

실행하면 다음과 같은 메시지가 출력됩니다:

Please deploy a DNS TXT record under the name:
_acme-challenge.example.com

with the following value:
aBcDeFgHiJkLmNoPqRsTuVwXyZ1234567890

DNS 관리 페이지에서 TXT 레코드를 추가한 후, 전파를 확인하고 Enter를 누르면 발급이 완료됩니다.

DNS 전파 확인 명령어

# Linux/macOS
dig TXT _acme-challenge.example.com +short

# 또는 nslookup
nslookup -type=TXT _acme-challenge.example.com

키 타입 선택: RSA vs ECDSA

Certbot은 두 가지 키 알고리즘을 지원합니다.

ECDSA (기본값, 권장)

certbot certonly --nginx -d example.com --key-type ecdsa
  • 키 크기가 작아 성능 우수
  • 동일 보안 수준에서 RSA보다 빠름
  • 현대 브라우저 모두 지원

RSA

# RSA 2048
certbot certonly --nginx -d example.com --key-type rsa

# RSA 4096 (더 강력한 보안)
certbot certonly --nginx -d example.com --key-type rsa --rsa-key-size 4096
  • 레거시 시스템 호환성 필요 시
  • 일부 오래된 클라이언트 지원

비교표

항목RSA 2048RSA 4096ECDSA P-256
보안 강도112bit140bit128bit
키 크기2048bit4096bit256bit
핸드셰이크 속도보통느림빠름
호환성최고최고매우 좋음

인증서 관리

발급된 인증서 목록 확인

sudo certbot certificates

출력 예시:

Certificate Name: example.com
  Domains: example.com www.example.com
  Expiry Date: 2024-03-15 (VALID: 89 days)
  Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
  Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem

인증서 파일 위치

/etc/letsencrypt/live/도메인명/
├── cert.pem       # 도메인 인증서
├── chain.pem      # 중간 인증서 (CA 체인)
├── fullchain.pem  # cert.pem + chain.pem (대부분 이것 사용)
├── privkey.pem    # 개인키
└── README

수동 갱신

# 모든 인증서 갱신 (만료 30일 이내만)
sudo certbot renew

# 강제 갱신
sudo certbot renew --force-renewal

# 특정 인증서만 갱신
sudo certbot certonly --force-renewal -d example.com

자동 갱신 설정

Certbot 설치 시 보통 자동으로 cron 또는 systemd timer가 설정됩니다.

확인 방법

# systemd timer 확인
sudo systemctl list-timers | grep certbot

# cron 확인
cat /etc/cron.d/certbot

수동으로 cron 설정

sudo crontab -e
# 매일 새벽 3시에 갱신 체크
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

인증서 삭제

sudo certbot delete --cert-name example.com

실전 팁

1. 테스트 환경에서는 Staging 서버 사용

Let’s Encrypt는 발급 횟수 제한이 있습니다. 테스트 시에는 Staging 서버를 사용하세요.

certbot certonly --nginx -d example.com \
  --staging

2. 여러 도메인을 하나의 인증서로

certbot certonly --nginx \
  -d example.com \
  -d www.example.com \
  -d api.example.com \
  -d admin.example.com

3. 갱신 후 자동 reload

certbot renew --post-hook "systemctl reload nginx"

4. 비대화형 모드 (스크립트용)

certbot certonly --nginx \
  -d example.com \
  --non-interactive \
  --agree-tos \
  -m your-email@example.com

5. DNS 자동화 (Cloudflare 예시)

Cloudflare DNS를 사용한다면 플러그인으로 자동화할 수 있습니다.

# 플러그인 설치
sudo apt install python3-certbot-dns-cloudflare

# API 토큰 설정
cat > ~/.secrets/cloudflare.ini << EOF
dns_cloudflare_api_token = your-api-token
EOF
chmod 600 ~/.secrets/cloudflare.ini

# 와일드카드 자동 발급
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
  -d example.com \
  -d "*.example.com"

발급 제한 (Rate Limits)

Let’s Encrypt는 남용 방지를 위해 발급 제한이 있습니다.

제한 항목한도
등록 도메인당 인증서주당 50개
중복 인증서주당 5개
실패한 검증시간당 5회
계정당 인증서3시간당 10개

Staging 서버는 제한이 훨씬 느슨하므로 테스트에 적극 활용하세요.

문제 해결

“Connection refused” 에러

  • 80포트가 열려있는지 확인
  • 방화벽 설정 확인: sudo ufw allow 80

“DNS problem” 에러

  • DNS 전파 대기 (최대 24-48시간)
  • TXT 레코드 값이 정확한지 확인
  • dig 명령으로 전파 상태 확인

“Too many requests” 에러

  • Rate Limit에 걸린 상태
  • 1시간 또는 1주일 후 재시도
  • Staging 서버로 먼저 테스트

인증서 경로를 못 찾을 때

# 심볼릭 링크 확인
ls -la /etc/letsencrypt/live/

# 실제 파일 위치
ls -la /etc/letsencrypt/archive/

마무리

Certbot과 Let’s Encrypt를 사용하면 누구나 무료로 신뢰할 수 있는 SSL 인증서를 발급받을 수 있습니다. 자동 갱신을 설정해두면 관리 부담도 거의 없습니다.

HTTPS는 이제 선택이 아닌 필수입니다. SEO, 보안, 사용자 신뢰 모든 면에서 SSL 인증서 적용은 기본입니다.


참고 링크




댓글 남기기