일반 Let’s Encrypt 인증서는 특정 도메인에만 유효합니다. *.example.com 형태의 와일드카드 인증서는 모든 서브도메인을 하나의 인증서로 커버할 수 있어 편리합니다.
와일드카드 인증서 특징
*.example.com→blog.example.com,api.example.com,shop.example.com등 모두 커버- DNS TXT 레코드 인증 방식 필수 (HTTP 파일 방식 불가)
- Certbot DNS 플러그인이나 수동 DNS 방식 사용
방법 1: 수동 DNS 인증 (어떤 DNS 서비스든 가능)
# certbot 설치
sudo apt install -y certbot
# 수동 DNS 인증으로 와일드카드 발급
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d "*.example.com" \
-d "example.com"
Certbot이 DNS TXT 레코드를 추가하라는 안내를 표시합니다:
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com
with the following value:
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoO1234567890
Once this is deployed,
Press Enter to Continue
DNS 관리 패널에서 _acme-challenge.example.com TXT 레코드를 추가하고 전파될 때까지 기다린 후 Enter를 누릅니다.
# DNS 전파 확인 (다른 터미널에서)
dig TXT _acme-challenge.example.com
nslookup -type=TXT _acme-challenge.example.com 8.8.8.8
방법 2: Cloudflare DNS 플러그인 (자동 갱신 가능)
Cloudflare를 DNS 서비스로 사용 중이라면 플러그인으로 자동화할 수 있습니다:
# Cloudflare 플러그인 설치
sudo apt install -y python3-certbot-dns-cloudflare
# 또는
pip3 install certbot-dns-cloudflare
Cloudflare API 키 파일 생성:
sudo mkdir -p /etc/letsencrypt/
sudo nano /etc/letsencrypt/cloudflare.ini
# /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = Cloudflare_API_토큰
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# 와일드카드 인증서 발급 (완전 자동화)
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d "*.example.com" \
-d "example.com"
방법 3: Route53 (AWS)
sudo apt install -y python3-certbot-dns-route53
sudo certbot certonly \
--dns-route53 \
-d "*.example.com" \
-d "example.com"
발급된 인증서 확인
# 인증서 목록
sudo certbot certificates
# 출력 예시:
# Found the following certs:
# Certificate Name: example.com
# Domains: *.example.com example.com
# Expiry Date: 2024-11-10 (VALID: 89 days)
# Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
# Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
Nginx에 와일드카드 인증서 적용
# /etc/nginx/sites-available/wildcard
# 모든 서브도메인에 동일한 인증서 사용
server {
listen 80;
server_name *.example.com example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name blog.example.com;
# 하나의 인증서로 모든 서브도메인 커버
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3001;
}
}
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
자동 갱신 설정
DNS 플러그인을 사용한 경우 자동 갱신이 가능합니다:
# 갱신 테스트
sudo certbot renew --dry-run
# 갱신 타이머 확인
sudo systemctl status certbot.timer
# 수동 갱신 크론 설정 (타이머가 없는 경우)
echo "0 0,12 * * * root certbot renew --quiet --dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini" | \
sudo tee /etc/cron.d/certbot-renew
수동 DNS 방식 자동 갱신 (갱신 후크)
수동 방식은 자동 갱신이 어렵습니다. 갱신 후크 스크립트로 부분 자동화할 수 있습니다:
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx
echo "$(date): Nginx reloaded after certificate renewal" >> /var/log/certbot-renew.log
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
SSL 보안 설정 강화
# /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000" always;
server {
listen 443 ssl;
include /etc/nginx/snippets/ssl-params.conf;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
와일드카드 인증서 하나로 여러 서브도메인을 관리하면 인증서 갱신 부담을 크게 줄일 수 있습니다. Cloudflare 등 지원되는 DNS 서비스를 사용한다면 완전 자동화를 권장합니다.