요즘은 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 적용 안 한 서비스가 있다면 지금 당장 하자.