Docs of Jace-Lab

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 레코드를 자동으로 수정할 수 있도록 토큰을 준비합니다.

  1. Dynu Control Panel 로그인 후 API Credentials 메뉴로 이동합니다.
  2. 화면에 표시된 API Key (Auth Token)를 복사하여 메모해 둡니다.

[2단계] uv 설치 및 가상환경(venv) 생성

시스템 전역 파이썬을 건드리지 않기 위해 독립된 공간을 만듭니다.

  1. uv 설치 및 환경변수 적용:
curl -LsSf https://astral.sh | sh
source $HOME/.local/bin/env
  1. 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 플러그인을 설치합니다.

  1. 패키지 설치:
uv pip install --python /opt/certbot-uv certbot certbot-dns-dynu-dev
  1. 플러그인 정상 인식 확인:
sudo /opt/certbot-uv/bin/certbot plugins
  • 출력되는 목록 중에 dns-dynu가 보이면 정상적으로 연동된 것입니다.

[4단계] Dynu 인증 자격 증명 파일 생성

  1. 설정 파일 생성:
sudo mkdir -p /etc/letsencrypt
sudo nano /etc/letsencrypt/dynu.ini
  1. 내용 작성 (1단계에서 복사한 API Key 입력):
dns_dynu_auth_token = 여기에_Dynu_API_Key_입력
  1. 보안 권한 격리 (기타 사용자의 열람 제한):
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 리버스 프록시 설정을 구성합니다.

  1. 설정 파일 편집:
sudo nano /etc/nginx/sites-available/dynu-wildcard.conf
  1. 내용 구성 (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;
    }
}
  1. 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일마다 만료되므로, 커스텀 가상환경 경로를 이용해 자동으로 갱신 프로세스가 돌도록 크론탭에 등록합니다.

  1. 크론탭 편집 창 열기:
sudo crontab -e
  1. 맨 아래에 다음 내용을 한 줄 추가 (매일 새벽 3시에 갱신 확인 후 Nginx 리로드):
0 3 * * * /opt/certbot-uv/bin/certbot renew --post-hook "systemctl reload nginx" > /dev/null 2>&1

On this page