HTTPS는 이제 선택이 아닌 기본입니다. 구글은 HTTPS 사이트에 검색 순위 가산점을 주고, Chrome은 HTTP 사이트에 “안전하지 않음” 경고를 표시합니다. AdSense·PayPal·Google 로그인 같은 제3자 서비스도 HTTPS를 전제로 동작하죠. 다행히 Let’s Encrypt를 쓰면 5분 안에 무료로 인증서를 발급받고 자동 갱신까지 설정할 수 있습니다.
이 글은 실제 운영 중인 서버(Ubuntu 24.04 + Nginx) 기준으로, 설치부터 자동 갱신, 흔한 오류 해결까지 한 번에 정리합니다.
Let’s Encrypt란? — “누구나 쓰는 공식 무료 SSL”
Let’s Encrypt는 비영리 재단 ISRG가 운영하는 인증 기관(CA)입니다. Mozilla, Google, Cisco, EFF 등이 후원하며, 전 세계 대부분의 브라우저·OS에 루트 인증서가 기본 포함되어 있어 유료 SSL 인증서와 동일한 신뢰 수준으로 인정됩니다.
- 💰 완전 무료
- 🔄 90일 유효기간, 자동 갱신 권장
- 🛠 Certbot 한 명령으로 발급·설정·갱신 모두 처리
- 🌐 와일드카드(*.example.com)와 서브도메인 여러 개 동시 발급 가능
- 🔐 ECDSA 최신 알고리즘 지원 (더 빠른 핸드셰이크)
사전 준비 체크리스트
- ☐ 도메인이 서버 IP로 A 레코드 정상 연결 (
dig example.com으로 확인) - ☐ 80번 포트가 열려 있음 (Let’s Encrypt 인증 과정에 필수)
- ☐ Nginx에 server_name이 정확히 설정됨
- ☐ 웹루트
/home/wpadmin/public_html에서.well-known접근 가능 - ☐ 루트(sudo) 권한
1. Certbot 설치
Ubuntu 22.04 이상은 snap으로 설치하는 방법을 공식 권장합니다. (APT 패키지 버전이 뒤쳐지는 경우 있음)
방법 A — snap (권장, 최신)
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -sf /snap/bin/certbot /usr/bin/certbot
방법 B — APT (간편)
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
python3-certbot-nginx는 Nginx 설정 파일을 자동 수정해 주는 플러그인입니다.
2. 인증서 발급 (1분)
# 한 번에 발급 + Nginx 설정 자동 수정 + HTTP → HTTPS 리다이렉트
sudo certbot --nginx -d example.com -d www.example.com
# 대화형 질문
# 1. 이메일 입력 (갱신 만료 알림용)
# 2. 약관 동의
# 3. 구독 수락 여부 (NO 권장)
# 4. HTTP → HTTPS 자동 리다이렉트 → 2 (Redirect)
완료되면 “Congratulations! You have successfully enabled HTTPS” 메시지와 함께 인증서 만료일이 표시됩니다. 이제 브라우저에서 https://example.com으로 접속 가능.
여러 도메인·서브도메인 한 번에
sudo certbot --nginx \
-d example.com -d www.example.com \
-d blog.example.com -d shop.example.com
와일드카드 인증서 (DNS 인증)
# 모든 서브도메인을 한 번에 커버
sudo certbot certonly --manual --preferred-challenges dns \
-d example.com -d "*.example.com"
# DNS TXT 레코드를 추가하라는 안내 → 도메인 관리 페이지에서 추가
3. 자동 갱신 확인
인증서는 90일마다 갱신이 필요합니다. Certbot은 설치 시 자동으로 systemd 타이머를 등록하므로 대부분 추가 작업이 필요 없습니다.
# 타이머 상태 확인
systemctl list-timers | grep certbot
# certbot.timer가 active여야 정상
# 갱신 dry-run (실제 갱신 없이 동작 확인)
sudo certbot renew --dry-run
일부 환경(예: snap 아닌 구버전)에서는 cron으로 수동 등록이 필요합니다.
# crontab -e (root)
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"
cron 설정 감각이 낯설다면 리눅스 cron 완벽 가이드 참고.
4. Nginx 설정 — 보안 강화 권장 옵션
Certbot이 자동 생성한 기본 설정은 “작동”에는 충분하지만, A+ 등급 보안을 얻으려면 몇 가지 추가가 필요합니다. SSL Labs 테스트에서 점수 확인 가능.
# /etc/nginx/sites-available/mysite
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Certbot 기본 — 최소 TLS 1.2
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# 추가 강화 (선택)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}
⚠️ HSTS(Strict-Transport-Security)는 한 번 켜면 브라우저가 수개월간 HTTP 접속을 차단합니다. 인증서 문제가 생기면 해제까지 시간이 걸리니, 완전히 안정화된 뒤 추가하세요.
5. WordPress에서 HTTPS 확정
인증서 발급 후 해야 할 3가지:
- 설정 → 일반에서 “워드프레스 주소”와 “사이트 주소”를 모두
https://로 변경 - Mixed Content 점검: 콘솔 → Network 탭에서
http://로 로드되는 이미지·CSS·JS가 없는지 확인 - Better Search Replace 플러그인으로 DB 내
http://example.com→https://example.com일괄 교체
# WP-CLI로 한 번에 교체
wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid
자주 만나는 에러와 해결
| 에러 | 원인 / 해결 |
|---|---|
DNS problem: NXDOMAIN | 도메인이 서버 IP를 가리키지 않음. dig로 A 레코드 확인 |
Connection refused on port 80 | 방화벽이 80번 차단. sudo ufw allow 80 |
Challenge failed: .well-known | Nginx가 .well-known 디렉터리 접근을 차단. 기본 location 블록 확인 |
Rate limit exceeded | 주당 발급 한도 초과. 2026년 기준 주당 50건. --dry-run으로 테스트 습관 필요 |
| 갱신은 되는데 Nginx가 못 불러옴 | 갱신 훅에 systemctl reload nginx 누락. post-hook 추가 |
| 와일드카드 인증서가 안 됨 | DNS 챌린지만 지원. HTTP 챌린지로는 불가 |
FAQ
Q. Cloudflare를 쓰는데 Let’s Encrypt를 또 발급해야 하나요?
Cloudflare Orange Cloud(프록시) 사용 시 브라우저 ↔ Cloudflare 구간은 Cloudflare SSL이 보호합니다. 하지만 Cloudflare ↔ 원본 서버 구간은 별도로 암호화가 필요합니다. “Full (strict)” 모드를 쓰려면 원본 서버에도 Let’s Encrypt를 설치해 두는 것이 정석입니다.
Q. 90일마다 정말 자동 갱신되나요?
Certbot의 systemd 타이머는 하루에 두 번 실행되며, 유효 만료 30일 이전인 인증서를 자동 갱신합니다. 첫 설치 후 sudo certbot renew --dry-run으로 한 번 검증하고, 이후엔 손대지 않아도 됩니다.
Q. 갱신이 실패하면 어떻게 알 수 있나요?
발급 시 입력한 이메일로 만료 20일 전·10일 전·1일 전에 알림 메일이 옵니다. 이메일을 확인하는 습관이 가장 중요. 서비스 장애 알림을 Slack·카카오워크로 받으려면 post-hook에 알림 스크립트 추가 가능.
Q. 로컬 개발 서버(localhost)에도 Let’s Encrypt가 되나요?
불가능합니다. Let’s Encrypt는 공용 DNS로 식별 가능한 도메인만 발급합니다. 로컬 환경은 mkcert 같은 도구로 자체 서명 인증서를 만들어 쓰세요.
Q. 인증서 종류(DV/OV/EV)가 뭐가 다른가요?
Let’s Encrypt는 DV(Domain Validation)만 제공합니다. 대부분의 개인 블로그·중소 사이트는 DV로 충분. 기업 공식 사이트, 금융, 대형 쇼핑몰은 기업 실재를 증명하는 OV/EV(유료)를 검토. 브라우저 자물쇠 아이콘은 동일하게 표시됩니다.
마무리
Let’s Encrypt는 무료 SSL의 표준으로 자리 잡았고, 실제로 이 사이트(nalkkul.com)도 동일한 방식으로 운영 중입니다. 설치 자체는 5분이면 끝나니, HTTP 사이트를 운영 중이라면 오늘 당장 전환하세요. 다음 단계로는 WP Super Cache 설정, Google Search Console 등록까지 이어 가면 블로그 운영의 기본 인프라가 모두 갖춰집니다.