무료 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 2048 | RSA 4096 | ECDSA P-256 |
|---|---|---|---|
| 보안 강도 | 112bit | 140bit | 128bit |
| 키 크기 | 2048bit | 4096bit | 256bit |
| 핸드셰이크 속도 | 보통 | 느림 | 빠름 |
| 호환성 | 최고 | 최고 | 매우 좋음 |
인증서 관리
발급된 인증서 목록 확인
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 인증서 적용은 기본입니다.
참고 링크