Dynu,Certbot,Nginx
Dynu, Certbot, Nginx
Let's Encrypt에서 모든 서브도메인을 아우르는 와일드카드 인증서(*.yourdomain.dynu.com)를 발급받으려면 HTTP 방식이 아닌 DNS Challenge(DNS-01) 방식을 반드시 사용해야 합니다. [1, 2] Certbot이 Dynu의 API를 이용해 DNS 레코드를 자동으로 수정하고 검증받을 수 있도록 설정하는 방법이 가장 효율적입니다.
[1단계] Dynu API Key 확인
Certbot이 DNS 레코드를 자동으로 수정할 수 있도록 토큰을 준비합니다.
- Dynu Control Panel 로그인 후 API Credentials 메뉴로 이동합니다.
- 화면에 표시된 API Key (Auth Token)를 복사하여 메모해 둡니다.
[2단계] uv 설치 및 가상환경(venv) 생성
시스템 전역 파이썬을 건드리지 않기 위해 독립된 공간을 만듭니다.
- uv 설치 및 환경변수 적용:
curl -LsSf https://astral.sh | sh
source $HOME/.local/bin/env- Certbot 전용 가상환경 생성:
sudo mkdir -p /opt/certbot-uv
sudo chown -R $USER:$USER /opt/certbot-uv
uv venv /opt/certbot-uv[3단계] uv를 통한 격리 패키지 설치
시스템 전역 uv 명령어를 사용해 방금 만든 가상환경 경로(--path)에 Certbot과 Dynu 플러그인을 설치합니다.
- 패키지 설치:
uv pip install --python /opt/certbot-uv certbot certbot-dns-dynu-dev- 플러그인 정상 인식 확인:
sudo /opt/certbot-uv/bin/certbot plugins- 출력되는 목록 중에 dns-dynu가 보이면 정상적으로 연동된 것입니다.
[4단계] Dynu 인증 자격 증명 파일 생성
- 설정 파일 생성:
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/dynu.ini- 내용 작성 (1단계에서 복사한 API Key 입력):
dns_dynu_auth_token = 여기에_Dynu_API_Key_입력- 보안 권한 격리 (기타 사용자의 열람 제한):
sudo chmod 600 /etc/letsencrypt/dynu.ini[5단계] 와일드카드 인증서 발급 요청
가상환경 내부에 설치된 certbot을 실행하여 인증서를 신청합니다. *.도메인과 일반 도메인을 동시에 신청해야 둘 다 HTTPS가 정상 작동합니다.
sudo /opt/certbot-uv/bin/certbot certonly \
--authenticator dns-dynu \
--dns-dynu-credentials /etc/letsencrypt/dynu.ini \
--dns-dynu-propagation-seconds 60 \
-d "myhome.dynu.com" \
-d "*.myhome.dynu.com"- 최초 실행 시 이메일 등록 및 약관 동의(Y 또는 A)를 진행합니다.
- 성공 시 /etc/letsencrypt/live/://dynu.com 폴더에 fullchain.pem 및 privkey.pem 파일이 생성됩니다.
[6단계] 순정 Nginx 설정 및 적용
모든 서브도메인이 하나의 와일드카드 인증서를 공유하도록 Nginx 리버스 프록시 설정을 구성합니다.
- 설정 파일 편집:
sudo nano /etc/nginx/sites-available/dynu-wildcard.conf- 내용 구성 (HTTP 자동 리다이렉트 및 서브도메인 예시):
# 1. HTTP(80) 접속 시 HTTPS(443)로 자동 리다이렉트
server {
listen 80;
server_name *.://dynu.com ://dynu.com;
return 301 https://$host$request_uri;
}
# 2. 서브도메인 서비스 (예: app1.://dynu.com)
server {
listen 443 ssl;
server_name app1.://dynu.com;
# 발급된 와일드카드 인증서 경로 지정
ssl_certificate /etc/letsencrypt/live/://dynu.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/://dynu.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8081; # 내부 웹서비스 포트
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}- Nginx 설정 활성화 및 재시작:
sudo ln -s /etc/nginx/sites-available/dynu-wildcard.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx[7단계] 주기적 자동 갱신(Cron) 설정
Let's Encrypt는 90일마다 만료되므로, 커스텀 가상환경 경로를 이용해 자동으로 갱신 프로세스가 돌도록 크론탭에 등록합니다.
- 크론탭 편집 창 열기:
sudo crontab -e- 맨 아래에 다음 내용을 한 줄 추가 (매일 새벽 3시에 갱신 확인 후 Nginx 리로드):
0 3 * * * /opt/certbot-uv/bin/certbot renew --post-hook "systemctl reload nginx" > /dev/null 2>&1