certbot이 기억나지 않을 때: Cloudflare + Nginx 와일드카드 SSL 자동화 기록
중년개발자
@loxo
13일 전
예전에는 DNS 서버를 직접 구성하고, SSL 인증서도 수동으로 관리하는 것이 당연했습니다.
이제는 무료 SSL 인증서와 다양한 클라우드 서비스 덕분에 인프라 운영이 훨씬 간편해졌지만, 동시에 특정 서비스에 대한 의존도는 점점 높아지고 있습니다.
신규 도메인을 등록할 때마다 매번 다시 찾아보게 되는 certbot 관련 명령어들도 그중 하나입니다. 자주 쓰지는 않지만, 필요할 때마다 헷갈리는 부분들을 개인적인 기록 차원에서 정리해두려 합니다.
이 문서는 Debian Linux + Nginx + Cloudflare DNS 환경을 기준으로 작성되었습니다.

📘 게으른 관리자(나)를 위한 완벽 가이드
Nginx 와일드카드 SSL 자동 갱신 (Cloudflare편)
이 가이드는 한 번 설정해두면 3개월마다 갱신 신경 쓸 필요 없이 "알아서 돌아가는" 시스템을 구축하는 것을 목표로 합니다.
📋 목차
- [사전 준비] Certbot 및 Cloudflare 플러그인 설치
- [핵심 설정] Cloudflare API 연동 (자동 갱신의 열쇠)
- [실전 1] 첫 번째 와일드카드 인증서 발급
- [실전 2] Nginx 웹 서버 연결
- [유지보수] 나중에 신규 도메인 추가하기
- [점검] 남은 기간 조회 및 갱신 테스트
- [요약] 3개월 뒤를 위한 치트시트
1. [사전 준비] Certbot 및 Cloudflare 플러그인 설치
Debian 서버에서 가장 먼저 수행합니다. snap을 사용하여 최신 버전을 설치합니다.
# 1. 패키지 목록 갱신 및 snapd 설치
sudo apt update
sudo apt install snapd -y
# 2. Snap 코어 업데이트 (필수)
sudo snap install core; sudo snap refresh core
# 3. Certbot 설치
sudo snap install --classic certbot
# 4. 명령어 심볼릭 링크 연결 (편의성)
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 5. [중요] Cloudflare DNS 플러그인 설치
# 이 플러그인이 있어야 갱신 시 DNS TXT 레코드를 자동으로 수정해줍니다.
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-cloudflare
2. [핵심 설정] Cloudflare API 연동
서버가 관리자 대신 Cloudflare에 로그인해서 DNS를 수정할 수 있도록 권한(Token)을 줘야 합니다.
2-1. Cloudflare 사이트에서 토큰 생성
- Cloudflare 로그인 -> 우측 상단 프로필 -> [My Profile] -> 좌측 [API Tokens]
- [Create Token] 클릭 -> Custom Token의 [Get started] 클릭
- 설정 값 입력:
- Token name:
Certbot Server(임의 지정) - Permissions (권한):
Zone/DNS/Edit(필수) - Zone Resources:
Include/All zones
- [Create Token] 완료 후 생성된 긴 암호(Token)를 복사합니다.
2-2. 서버에 토큰 저장
터미널로 돌아와서 비밀 파일을 생성합니다.
# 비밀 폴더 생성
mkdir -p ~/.secrets/certbot
# 파일 편집
nano ~/.secrets/certbot/cloudflare.ini
파일 안에 아래 내용을 붙여넣고 저장(Ctrl+X, Y, Enter)합니다.
dns_cloudflare_api_token = 여기에_복사한_토큰_붙여넣기
2-3. 보안 설정 (필수)
이 파일은 비밀번호나 다름없으므로 권한을 잠급니다.
chmod 600 ~/.secrets/certbot/cloudflare.ini
3. [실전 1] 첫 번째 와일드카드 인증서 발급
이제 site-a.com의 인증서를 발급받습니다. DNS 플러그인을 쓰기 때문에 터미널에서 멈추지 않고 한 번에 완료됩니다.
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
-d "*.site-a.com" \
-d "site-a.com"
옵션 설명:
--dns-cloudflare: DNS 인증 방식을 사용 (와일드카드 필수)
-d "*.site-a.com" -d "site-a.com": 모든 서브 도메인(*)과 루트 도메인 둘 다 커버
성공 시: Congratulations! 메시지와 함께 인증서 경로가 출력됩니다.
4. [실전 2] Nginx 웹 서버 연결
발급받은 인증서를 Nginx 설정 파일에 등록합니다.
파일 열기: /etc/nginx/sites-available/default (또는 해당 도메인 conf)
server {
listen 443 ssl;
server_name site-a.com *.site-a.com;
# [중요] Certbot이 알려준 경로 입력
ssl_certificate /etc/letsencrypt/live/site-a.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site-a.com/privkey.pem;
# SSL 보안 기본 설정 (필요시 추가)
# include /etc/letsencrypt/options-ssl-nginx.conf;
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# ... 나머지 설정 ...
}
적용:
sudo nginx -t # 오타 검사
sudo systemctl reload nginx # 재시작
5. [유지보수] 나중에 신규 도메인 추가하기
시간이 지나 site-b.com을 새로 추가해야 할 때입니다. 1, 2단계 설정은 이미 되어 있으므로 명령어 한 줄이면 끝납니다.
- 발급 명령어 실행 (도메인만 변경)
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
-d "*.site-b.com" \
-d "site-b.com"
- Nginx 설정 추가:
site-b.com용 conf 파일 생성 및 경로 연결. - Nginx 리로드:
sudo systemctl reload nginx
6. [점검] 남은 기간 조회 및 갱신 테스트
관리자가 가장 자주 쓰게 될 명령어들입니다.
Q. 내 인증서 언제 만료되나요? (생존 확인)
sudo certbot certificates
- 결과 중
VALID: 89 days(남은 일수)를 확인하세요.
Q. 자동 갱신 진짜 되나요? (불안 해소)
sudo certbot renew --dry-run
- Certbot이 가상으로 갱신을 시도해봅니다.
Simulated renewals succeeded가 뜨면 안심하셔도 됩니다.
📌 [최종 요약] 유지보수 담당자를 위한 치트시트
나중에 기억이 안 날 때, 이 표만 확인하세요.
| 상황 | 명령어 / 행동 | 핵심 포인트 |
|---|---|---|
| 남은 기간 확인 | sudo certbot certificates | Expiry Date 및 VALID 확인 |
| 신규 도메인 추가 | sudo certbot certonly --dns-cloudflare ... | 위 5번 항목 명령어 복사해서 사용 |
| 자동 갱신 테스트 | sudo certbot renew --dry-run | 에러 없는지 확인 |
| 인증서 파일 위치 | /etc/letsencrypt/live/[도메인]/ | .pem 파일들이 있는 곳 |
| 설정 변경 후 | sudo systemctl reload nginx | Nginx 재시작 필수 |
팁: Cloudflare 플러그인을 사용했기 때문에 90일마다 갱신은 백그라운드에서 100% 자동으로 이루어집니다. 여러분이 할 일은 가끔
certificates명령어로 잘 살아있는지 봐주는 것뿐입니다.