요즘은 HTTPS가 선택이 아니라 필수다. 브라우저에서 “안전하지 않음” 경고를 띄우니까 사용자 입장에서도 신뢰가 안 간다. 예전에는 SSL 인증서가 비쌌는데, Let’s Encrypt 덕분에 무료로 쓸 수 있게 됐다. 다만 90일마다 갱신해야 하는데, 자동화해두면 한 번 설정하고 까먹어도 된다.

certbot 설치

Ubuntu 기준:

sudo apt update
sudo apt install certbot python3-certbot-nginx

python3-certbot-nginx 플러그인이 Nginx 설정까지 자동으로 건드려주니까 같이 설치하는 게 편하다.

인증서 발급

Nginx가 이미 돌아가고 있고 도메인이 서버 IP로 연결되어 있다면:

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

이메일 주소를 물어보고, 약관 동의를 구하고, HTTP → HTTPS 리다이렉트를 자동으로 할지 물어본다. 자동 리다이렉트를 선택하면 certbot이 Nginx 설정 파일을 알아서 수정해준다.

발급이 완료되면 인증서는 /etc/letsencrypt/live/example.com/ 아래에 저장된다:

fullchain.pem  → 서버 인증서 + 중간 인증서
privkey.pem    → 개인 키

Nginx SSL 설정 확인

certbot이 수정한 Nginx 설정을 확인해보면 대략 이런 모양이다:

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

자동 갱신 설정

certbot을 설치하면 보통 systemd 타이머나 cron이 자동으로 등록된다. 확인해보자:

# systemd 타이머 확인
sudo systemctl list-timers | grep certbot

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

없다면 수동으로 cron에 추가한다:

sudo crontab -e
# 매일 새벽 2시 30분에 갱신 시도
30 2 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"

--quiet은 갱신할 게 없으면 아무것도 출력하지 않는다. --deploy-hook은 실제로 갱신이 이루어졌을 때만 실행된다. Nginx를 리로드해야 새 인증서가 적용되니까.

갱신이 제대로 되는지 테스트:

sudo certbot renew --dry-run

--dry-run은 실제 갱신 없이 시뮬레이션만 한다. 에러가 없으면 정상이다.

와일드카드 인증서

서브도메인이 여러 개라면 와일드카드 인증서가 편하다. DNS 인증 방식으로 발급받아야 한다:

sudo certbot certonly --manual --preferred-challenges dns \
  -d example.com -d "*.example.com"

DNS TXT 레코드를 추가하라는 안내가 나온다. _acme-challenge.example.com에 지정된 값을 넣으면 된다. 이 방식은 자동 갱신이 좀 까다로운데, Cloudflare 같은 DNS 플러그인을 쓰면 자동화할 수 있다:

sudo apt install python3-certbot-dns-cloudflare

Cloudflare API 토큰을 설정 파일에 넣어두면:

# /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
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"

이렇게 하면 DNS 인증도 자동으로 처리되니까 갱신도 자동으로 된다.

인증서 상태 확인

현재 발급된 인증서 목록과 만료일을 확인하려면:

sudo certbot certificates

만료가 임박했는데 자동 갱신이 안 되고 있다면 로그를 확인하자:

sudo cat /var/log/letsencrypt/letsencrypt.log

한번 세팅해두면 진짜 신경 쓸 일이 없다. 2~3년 동안 자동으로 갱신되면서 문제가 생긴 적이 없었다. HTTPS 적용 안 한 서비스가 있다면 지금 당장 하자.