
1. SSL 인증서 발급 전 필수 준비 사항
Let’s Encrypt 인증서를 발급받기 전, 서버와 네트워크 환경이 올바르게 준비되어 있는지 확인해야 합니다. 대부분의 발급 실패는 네트워크 포트 차단이나 DNS 레코드 미스매치로 인해 발생합니다.
- 도메인 DNS A 레코드 등록: 발급받으려는 도메인(예:
example.com및www.example.com)이 현재 서버의 고유 공인 IP 주소(Public IPv4)를 가리키도록 설정되어 있어야 합니다. - 방화벽 80(HTTP) 및 443(HTTPS) 포트 개방: Let’s Encrypt의 도메인 유효성 검증(HTTP-01 Challenge)은 기본적으로 80번 포트를 통해 이루어집니다. 클라우드 인스턴스(AWS Security Group, GCP 방화벽, Vultr 등)와 OS 자체 방화벽(UFW)에서 두 포트가 모두 열려 있어야 합니다.
- Nginx 정상 구동: Nginx 서버 블록 파일 내에 도메인 이름(
server_name)이 정확히 명시되어 있어야 Certbot이 대상 블록을 식별할 수 있습니다.
# Ubuntu UFW 방화벽 Nginx 포트 허용 명령어
sudo ufw allow 'Nginx Full'
sudo ufw status

2. Certbot 설치 및 Let’s Encrypt 인증서 발급
Let’s Encrypt와 EFF(전자프런티어재단)에서는 최신 의존성 유지와 보안 패치를 위해 Snap 패키지 관리자를 통한 Certbot 설치를 공식 권장하고 있습니다.
2-1. Certbot 설치 (Snap 기준)
# 1. snapd 최신 상태 확인 sudo snap install core; sudo snap refresh core2. 기존 apt 버전 certbot이 있다면 제거 (충돌 방지) sudo apt remove certbot -y 3. Certbot 클래식 모드로 설치 sudo snap install --classic certbot 4. 심볼릭 링크 생성 (어디서나 certbot 명령 실행 가능)sudo ln -s /snap/bin/certbot /usr/bin/certbot
참고: 만약 Snap을 지원하지 않는 최소형 컨테이너나 가상화 환경(일부 OpenVZ/LXC VPS)이라면 sudo apt update && sudo apt install certbot python3-certbot-nginx -y 명령어를 사용하여 APT 패키지로 설치할 수 있습니다.
2-2. Nginx 플러그인을 이용한 원클릭 발급 및 적용
가장 간편한 방법은 Nginx 플러그인을 사용하여 인증서 발급과 Nginx 설정 파일 수정을 한 번에 처리하는 것입니다.
# 도메인 대상 인증서 발급 (본인의 도메인으로 대체)
sudo certbot --nginx -d example.com -d www.example.com
명령어를 실행하면 대화형 프롬프트가 실행됩니다.
- 이메일 주소 입력: 인증서 만료 경고 및 긴급 보안 공지를 수신할 이메일을 입력합니다.
- 이용약관 동의:
Y를 입력하여 Let’s Encrypt 서비스 약관에 동의합니다. - 이메일 공유 여부: EFF 소식 수신 여부 선택 (
Y또는N). - HTTPS 리다이렉트 설정: HTTP 접속 시 HTTPS로 강제 이동시킬지 여부를 묻는 경우, 보안을 위해 리다이렉트 활성화 옵션을 선택합니다.

3. Certbot 인증서 발급 방식 비교
Certbot은 인프라 구성과 무중단 서비스 요건에 따라 다양한 발급 방식을 제공합니다. 본인의 환경에 맞는 방식을 선택하세요.
| 발급 방식 | 인증 메커니즘 | Nginx 중단 필요 여부 | 추천 사용 환경 |
|---|---|---|---|
| –nginx (플러그인) | Nginx 설정을 임시 수정하여 HTTP-01 챌린지 수행 후 자동 롤백 및 SSL 설정 추가 | 중단 없음 (무중단) | 일반적인 단일 Nginx 웹서버, 개인 블로그/홈페이지 |
| certonly –webroot | 지정된 정적 파일 루트 경로(/.well-known/acme-challenge/)에 파일 생성 | 중단 없음 (무중단) | 복잡한 커스텀 Nginx 설정을 직접 유지하고 싶은 사용자 |
| certonly –standalone | Certbot이 자체 내장 웹서버를 구동하여 80번 포트로 직접 인증 | 80번 포트 점유 해제 필요 (Nginx 일시 중지) | 웹서버가 없거나 프록시 구성 전 인증서를 먼저 확보할 때 |
| certbot-dns-* (DNS-01) | DNS TXT 레코드를 동적으로 추가하여 도메인 소유권 검증 | 중단 없음 | 와일드카드 인증서(*.example.com) 또는 80번 포트가 막힌 환경 |
4. Nginx 설정 파일 자동 변경 확인 및 보안 강화
Certbot의 --nginx 플러그인을 사용하면 /etc/nginx/sites-available/ 내의 해당 서버 블록 파일이 자동으로 업데이트됩니다.
# /etc/nginx/sites-available/example.com 내부 변경 예시
server {
server_name example.com www.example.com;
# Certbot이 추가한 SSL 설정
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
설정이 완료되면 구문 검사를 수행하고 Nginx를 리로드하여 변경 사항을 적용합니다.
sudo nginx -t
sudo systemctl reload nginx
5. SSL 인증서 자동 갱신 메커니즘 및 Dry-run 테스트
Let’s Encrypt 인증서는 90일간 유효하며, Certbot은 만료일 기준 30일 전(발급 후 약 60일 시점)부터 갱신을 시도합니다. Snap 또는 APT로 설치된 최신 Certbot은 백그라운드 systemd 타이머를 통해 하루 2회 자동으로 갱신 대상 여부를 확인합니다.
5-1. Systemd 타이머 동작 상태 확인
# certbot 갱신 타이머 활성화 상태 확인 sudo systemctl status certbot.timer타이머 목록에서 다음 실행 예정 시각 확인sudo systemctl list-timers | grep certbot
5-2. 자동 갱신 시뮬레이션 (Dry-run)
실제 만료일까지 기다리지 않고 갱신 프로세스가 올바르게 동작하는지 테스트하려면 --dry-run 플래그를 사용합니다.
sudo certbot renew --dry-run
출력 결과 마지막에 Congratulations, all simulated renewals succeeded 메시지가 나타나면 자동 갱신 설정이 완벽하게 완료된 것입니다.
인증서 갱신 후 Nginx 리로드: Certbot Nginx 플러그인으로 발급받은 경우 갱신 시 자동으로 Nginx가 새 인증서를 로드합니다. 만약 certonly 방식으로 발급받았다면 /etc/letsencrypt/renewal-hooks/deploy/ 디렉터리에 systemctl reload nginx 스크립트를 배치하거나 --deploy-hook "systemctl reload nginx" 옵션을 등록해야 합니다.
6. 자주 발생하는 발급 및 갱신 오류 해결법
오류 1: Challenge failed for domain (HTTP-01)
- 원인: Let’s Encrypt 검증 서버가 도메인의 80번 포트로 접근할 수 없음.
- 해결: 1) DNS A 레코드 IP가 현재 서버와 일치하는지 확인 (
dig +short example.com A).
2) 클라우드 방화벽(Inbound Rules)에서 80번 및 443번 포트가 전 세계(0.0.0.0/0)에 개방되어 있는지 확인.
오류 2: Could not bind to IPv4 or IPv6 / Address already in use
- 원인:
--standalone모드를 실행할 때 이미 Nginx나 Apache가 80번 포트를 점유하고 있음. - 해결:
--standalone대신--nginx또는--webroot모드를 사용하거나,sudo systemctl stop nginx후 실행.
오류 3: Cloudflare 프록시(Orange Cloud) 활성화 시 갱신 실패
- 원인: Cloudflare의 캐싱 또는 보안 규칙이
/.well-known/acme-challenge/경로를 차단하거나 리다이렉트 루프를 유발. - 해결: Cloudflare SSL/TLS 암호화 모드를 Full (Strict)로 설정하거나,
certbot-dns-cloudflare플러그인을 활용한 DNS-01 검증 방식으로 전환.
7. 자주 묻는 질문 (FAQ)
Q. 와일드카드 인증서(*.example.com)도 발급받을 수 있나요?
네, 가능합니다. 단, 와일드카드 인증서는 HTTP-01 검증이 불가능하며 반드시 DNS-01 챌린지를 사용해야 합니다. Cloudflare, AWS Route53 등 지원되는 DNS 플러그인(예: certbot-dns-cloudflare)을 설치하여 DNS API 토큰을 연동하면 와일드카드 인증서도 자동 갱신이 가능합니다.
Q. Let’s Encrypt 인증서 유효기간을 90일보다 더 길게 늘릴 수 있나요?
불가능합니다. Let’s Encrypt의 정책상 모든 무료 인증서의 만료 기간은 90일로 고정되어 있습니다. 이는 도메인 탈취 시 피해 기간을 최소화하고 자동 갱신 프로세스를 정착시키기 위한 보안 표준 정책입니다. Certbot 자동 갱신 타이머가 정상 동작하면 관리자가 직접 개입할 필요가 없습니다.
Q. 인증서 발급 횟수 제한(Rate Limit)이 있나요?
동일한 등록 도메인 세트당 주당 50개의 인증서 발급 제한(Certificates per Registered Domain)과 반복 실패 시 일정 시간 차단되는 등의 Rate Limit이 존재합니다. 설정 테스트 중에는 --dry-run 또는 Let’s Encrypt의 Staging 환경(--staging)을 사용하여 한도 초과를 방지해야 합니다.
8. 배포 후 최종 점검 및 요약
Let’s Encrypt와 Certbot의 조합을 활용하면 추가 비용 없이 견고한 HTTPS 보안 환경을 구축할 수 있습니다. 설정 완료 후 웹 브라우저에서 https://yourdomain.com으로 접속하여 자물쇠 아이콘이 정상적으로 표시되는지 확인하고, 외부 SSL 검증 도구(예: SSL Labs)를 통해 구성 등급을 점검하는 것을 권장합니다.
- 도메인 A 레코드 연결 및 80/443 방화벽 포트 개방 확인
sudo certbot --nginx명령을 통한 인증서 발급 및 HTTPS 리다이렉트 구성sudo certbot renew --dry-run명령을 통한 자동 갱신 프로세스 시뮬레이션 성공 여부 확인