일반 Let’s Encrypt 인증서는 특정 도메인에만 유효합니다. *.example.com 형태의 와일드카드 인증서는 모든 서브도메인을 하나의 인증서로 커버할 수 있어 편리합니다.

와일드카드 인증서 특징

  • *.example.comblog.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 서비스를 사용한다면 완전 자동화를 권장합니다.