Jace Docs

Certbot

Certbot 사용법

1. Certbot 설치하기

먼저 서버의 패키지 목록을 업데이트하고 Certbot 및 Nginx용 플러그인을 설치합니다.

sudo apt update
sudo apt install certbot python3-certbot-nginx

2. SSL 인증서 발급 및 자동 설정

Certbot의 가장 큰 장점은 Nginx 설정을 알아서 분석하고 SSL을 적용해 준다는 점입니다.

방법 A: 자동 설정 (권장)

인증서 발급은 물론, Nginx 설정 파일(.conf)까지 자동으로 수정해 줍니다.

sudo certbot --nginx -d example.com -d www.example.com
  • -d: 적용할 도메인을 입력합니다.
  • 실행 후 이메일 입력, 약관 동의 절차를 거치면 끝납니다.
  • HTTP를 HTTPS로 자동 리다이렉트할지 물어보는데, 웬만하면 2 (Redirect)를 선택하세요.

방법 B: 인증서만 발급 (수동 설정 선호 시)

설정 파일 건드리는 게 싫다면 인증서 파일만 받을 수도 있습니다.

sudo certbot certonly --nginx -d example.com

3. 설치 경로 확인

발급이 완료되면 인증서 파일들은 다음 경로에 저장됩니다. (직접 설정 시 필요)

  • 인증서 전체 체인: /etc/letsencrypt/live/도메인명/fullchain.pem
  • 개인키: /etc/letsencrypt/live/도메인명/privkey.pem

4. 인증서 자동 갱신 테스트

Let's Encrypt 인증서는 90일 동안만 유효합니다. 하지만 Certbot을 설치하면 보통 자동으로 갱신 스케줄러(cron)가 등록됩니다. 제대로 작동하는지 미리 테스트해 볼 수 있습니다.

sudo certbot renew --dry-run

Tip: 위 명령어를 입력했을 때 에러가 없다면, 앞으로 유효기간 만료 30일 전마다 시스템이 알아서 갱신을 진행합니다.


5. 자주 쓰는 주요 명령어 모음

명령어설명
certbot certificates현재 서버에 설치된 인증서 목록과 만료일 확인
certbot renew수동으로 모든 인증서 갱신 시도
certbot delete --cert-name 도메인명특정 도메인의 인증서 삭제

⚠️ 주의사항

  1. 80번 포트 개방: 인증 과정에서 Let's Encrypt 서버가 내 서버에 접속해야 하므로, 방화벽에서 80(HTTP)과 443(HTTPS) 포트가 열려 있어야 합니다.
  2. 도메인 연결: 당연히 해당 도메인이 현재 서버의 IP를 가리키고 있어야 인증이 성공합니다.

Certbot을 이용한 Dynu 도메인 인증서 발급

파이썬 환경(pip3)과 격리된 도구 관리(pipx), 그리고 실제 Certbot 발급까지 이어지는 배포 서버 초기화 및 재구축 가이드입니다.

이 과정은 시스템의 파이썬 환경을 건드리지 않으면서, certbot만 독립된 공간에 가두어 플러그인 충돌을 원천 차단하는 가장 표준적인 방식입니다.


1단계: 기존 찌꺼기 강제 삭제 (Purge All)

어설프게 남아있는 설정이 "이미 설치됨" 에러를 만듭니다. 모든 경로를 싹 비웁니다.

# 1. pip3 설치분 삭제 (시스템 보호 무시 옵션 포함)
sudo pip3 uninstall certbot certbot-dns-dynu -y --break-system-packages 2>/dev/null

# 2. apt 설치분 삭제
sudo apt remove --purge certbot -y 2>/dev/null
sudo apt autoremove -y

# 3. pipx 관련 폴더 및 캐시 강제 삭제 (핵심)
sudo rm -rf /root/.local/pipx
sudo rm -rf /root/.cache/pipx
sudo rm -rf ~/.local/pipx
sudo rm -rf ~/.cache/pipx

# 4. 꼬여있는 심볼릭 링크 및 실행 파일 삭제
sudo rm -f /usr/bin/certbot
sudo rm -f /usr/local/bin/certbot

2단계: pipx 설치 및 환경 구성

pipx를 설치하고, sudo 환경에서도 명령어를 찾을 수 있도록 설정합니다.

# 1. pipx 설치
sudo apt update
sudo apt install pipx -y

# 2. root 환경에 pipx 경로 등록
sudo pipx ensurepath

# 3. 현재 쉘에 설정 반영
source ~/.bashrc
sudo -i source /root/.bashrc # root 쉘 환경 업데이트

3단계: Certbot 재구축 (The Clean Build)

이제 pipx를 통해 아무런 간섭이 없는 깨끗한 가상환경에 Certbot을 설치합니다.

# 1. Certbot 설치 (이때 /root/.local/pipx/venvs/certbot 경로에 독립 환경 생성됨)
sudo pipx install certbot

# 2. Dynu 플러그인을 Certbot 전용 환경에 주입 (Inject)
sudo pipx inject certbot certbot-dns-dynu

# 3. 시스템 어디서든 'certbot'을 부를 수 있게 연결
sudo ln -sf /root/.local/bin/certbot /usr/bin/certbot

4단계: 설치 결과 확인

아래 명령어를 입력했을 때, dns-dynu가 리스트에 보인다면 성공입니다.

sudo certbot plugins

5단계: Dynu API 인증 파일 만들기

Certbot이 자동으로 DNS를 수정할 수 있도록 API 키를 파일로 저장해야 합니다.

# 설정 폴더 생성 (없다면)
mkdir -p ~/.secrets/certbot/
# 파일 생성
nano ~/.secrets/certbot/dynu.ini

내용 입력 (본인의 API Key 입력):

dns_dynu_auth_token = YOUR_DYNU_API_KEY

보안 설정 (매우 중요):

chmod 600 ~/.secrets/certbot/dynu.ini

6단계: Certbot으로 Dynu 인증서 발급

이제 DNS-01 챌린지 방식으로 인증서를 발급받습니다. 배포 서버의 지연 시간을 고려하여 120초 대기 옵션을 넣습니다.

sudo certbot certonly \
  --authenticator dns-dynu \
  --dns-dynu-credentials /home/jace/.secrets/certbot/dynu.ini \
  --dns-dynu-propagation-seconds 120 \
  -d "jace1.mywire.org" \
  -d "*.jace1.mywire.org" \
  --agree-tos \
  -m gnedu.biz@gmail.com
  • --dns-dynu-propagation-seconds 120: 아까 겪으신 시간 문제를 해결하기 위해, DNS에 값을 쓰고 2분 동안 대기하도록 설정

7단계: Nginx 설정에 적용하기

발급이 성공하면 /etc/letsencrypt/live/jace1.mywire.org/ 경로에 파일이 생깁니다. 이를 Nginx 설정 파일에 넣으세요.

server {
    listen 443 ssl;
    server_name jace1.mywire.org docs.jace1.mywire.org;

    ssl_certificate /etc/letsencrypt/live/jace1.mywire.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jace1.mywire.org/privkey.pem;

    # 보안 설정 추천
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://localhost:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

8. 왜 이 방식이 더 안정적인가요?

  1. 멱등성: Certbot은 인증서가 이미 있고 유효기간이 넉넉하면 아무 작업도 하지 않습니다. Caddy처럼 실행할 때마다 조마조마하며 DNS를 건드리지 않습니다.
  2. 분리된 관리: DNS 문제로 인증서 발급이 실패해도 Nginx 서버 자체는 (기존 인증서가 있다면) 죽지 않고 잘 돌아갑니다.
  3. 수동 제어: propagation-seconds를 넉넉히 줄 수 있어 Dynu의 느린 전파 속도를 확실히 기다려줄 수 있습니다.
  4. pip3 vs pipx: pip3는 도서관 전체에 책을 꽂는 것이라면, pipx는 책 한 권을 위한 개인 서재를 따로 만드는 것입니다. Certbot 같은 독립 도구는 무조건 pipx가 유리합니다.
  5. 갱신(Renew): 이렇게 설치해도 sudo certbot renew는 똑같이 작동합니다.
  6. 권한 에러 발생 시: /home/jace/.secrets/certbot/dynu.ini 파일의 권한이 600인지, 소유자가 jace 혹은 root인지 다시 확인하세요.

9. 갱신(Renew) 설정

인증서 갱신은 sudo certbot renew 명령어로 수행하며, 보통 크론탭(crontab)에 등록해서 자동화합니다. 갱신 후 Nginx를 재시작하도록 deploy-hook을 걸어두면 완벽합니다.

# 갱신 테스트용
sudo certbot renew --dry-run

On this page