Certbot 인증서 발급 및 관리 Cheat Sheet
Certbot은 Let's Encrypt를 통해 무료 SSL/TLS 인증서를 발급받고 관리하는 데 사용되는 도구입니다. 웹 서비스의 보안을 강화하고 사용자에게 신뢰를 제공하는 데 필수적입니다.
1. Certbot 설치
대부분의 리눅스 배포판에서 Certbot은 패키지 관리자를 통해 쉽게 설치할 수 있습니다.
Ubuntu/Debian:
Bash
sudo snap install core sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
- 근거 자료: Certbot 공식 문서 (https://certbot.eff.org/instructions)
2. 인증서 발급 (일반적인 방법)
가장 일반적인 방법은 웹 서버 플러그인을 사용하여 인증서를 발급받고 자동으로 설정하는 것입니다.
Nginx 웹 서버의 경우:
Bash
sudo certbot --nginx
설명: 이 명령어는 Nginx 설정 파일을 자동으로 분석하여 도메인을 찾고, 인증서 발급 및 HTTPS 설정을 자동으로 처리합니다. 대화형으로 진행되며, 이메일 주소, 약관 동의, 리다이렉트 설정 여부 등을 묻습니다.
근거 자료: Certbot Nginx 플러그인 공식 문서 (https://certbot.eff.org/docs/using.html#nginx)
Apache 웹 서버의 경우:
Bash
sudo certbot --apache
설명: Nginx와 유사하게 Apache 설정 파일을 분석하여 인증서 발급 및 HTTPS 설정을 자동으로 처리합니다.
근거 자료: Certbot Apache 플러그인 공식 문서 (https://certbot.eff.org/docs/using.html#apache)
웹 서버 플러그인 없이 수동으로 발급 (웹루트 인증):
Bash
sudo certbot certonly --webroot -w /var/www/html -d your_domain.com -d www.your_domain.com
설명:
$ -w
옵션 뒤에는 웹사이트의 루트 디렉터리(웹 서버가 정적 파일을 제공하는 경로)를 지정합니다.$ -d
옵션으로 인증서를 발급받을 도메인을 지정합니다. 여러 도메인을 하나의 인증서에 포함할 수 있습니다.근거 자료: Certbot 사용자 가이드 (https://certbot.eff.org/docs/using.html#webroot)
3. 발급받은 인증서를 자동으로 갱신/관리하는 방법
Let's Encrypt 인증서는 90일마다 갱신해야 합니다. Certbot은 이 과정을 자동으로 처리하도록 설계되었습니다.
자동 갱신 설정: Certbot 설치 시 대부분의 경우 자동 갱신을 위한
cron
job 또는systemd
타이머가 자동으로 설정됩니다. Certbot은 매일 2회(systemd
타이머 기준) 또는 주 2회(cron
job 기준) 갱신이 필요한 인증서가 있는지 확인하고, 만료 기한이 30일 미만으로 남은 인증서를 자동으로 갱신합니다.갱신 테스트 (Dry Run):
Bash
sudo certbot renew --dry-run
설명: 실제로 인증서를 갱신하지 않고 갱신 프로세스가 성공적으로 작동하는지 테스트합니다. 이 명령어가 성공하면 자동 갱신도 문제없이 작동할 가능성이 높습니다. 개발자로서 서비스를 운영할 때 이러한 사전 테스트는 매우 중요합니다.
근거 자료: Certbot 공식 문서 - Renewal (https://certbot.eff.org/docs/using.html#renewing-certificates)
갱신 강제 실행:
Bash
sudo certbot renew --force-renewal
설명: 만료 기한과 상관없이 모든 인증서를 강제로 갱신합니다. 디버깅 목적이나 특정 상황에서만 사용해야 합니다.
근거 자료: Certbot 공식 문서 - Renewal (https://certbot.eff.org/docs/using.html#renewing-certificates)
갱신 주기 확인 (Ubuntu/Debian의 systemd 타이머의 경우):
Bash
sudo systemctl list-timers | grep certbot
- 설명: 이 명령어를 통해 Certbot 갱신 타이머가 설정되어 있는지, 그리고 다음 실행 예정 시간이 언제인지 확인할 수 있습니다. 보통
certbot.timer
라는 이름으로 등록되어 있습니다.
- 설명: 이 명령어를 통해 Certbot 갱신 타이머가 설정되어 있는지, 그리고 다음 실행 예정 시간이 언제인지 확인할 수 있습니다. 보통
4. TXT 레코드 인증 방식을 이용해 도메인 인증서를 발급받는 방법 (DNS-01 챌린지)
이 방식은 웹 서버에 접근할 수 없거나, 여러 서브도메인 또는 와일드카드 인증서(*.your_domain.com
)를 발급받을 때 유용합니다. DNS 제공 업체의 웹 인터페이스를 통해 DNS TXT 레코드를 수동으로 추가해야 합니다.
TXT 레코드 방식 발급 명령어:
Bash
sudo certbot certonly --manual --preferred-challenges dns -d your_domain.com -d *.your_domain.com
설명:
--manual
: 수동 인증 방식을 사용합니다.--preferred-challenges dns
: DNS 챌린지를 선호함을 명시합니다.your_domain.com
,*.your_domain.com
: 인증서를 발급받을 도메인을 지정합니다. 와일드카드 인증서(*.your_domain.com
)는 DNS-01 챌린지를 통해서만 발급 가능합니다.
진행 과정:
명령어를 실행하면 Certbot이 특정 TXT 레코드(
_acme-challenge.your_domain.com
)와 그 값을 생성하여 보여줍니다.사용자는 이 정보를 DNS 제공 업체의 웹 인터페이스에 로그인하여 해당 도메인에 대한 TXT 레코드를 추가해야 합니다.
DNS 전파에는 시간이 걸릴 수 있으므로, 레코드를 추가한 후 Certbot에서
Enter
를 눌러 계속 진행하기 전에 DNS 전파가 완료될 때까지 잠시 기다려야 합니다.Certbot이 DNS 레코드를 확인하고 인증서를 발급합니다.
근거 자료: Let's Encrypt 챌린지 타입 설명 (https://letsencrypt.org/docs/challenge-types/#dns-01-challenge), Certbot 사용자 가이드 - Manual Mode (https://certbot.eff.org/docs/using.html#manual)
5. TXT 레코드를 이용해 발급받은 인증서를 다시 일반적인 방법으로 되돌리는 방법
DNS-01 챌린지를 사용하여 발급받은 인증서를 나중에 웹 서버 플러그인(HTTP-01 챌린지) 방식으로 갱신하고 싶을 수 있습니다. 이는 Certbot이 인증서를 갱신할 때 기본적으로 이전에 성공했던 챌린지 방식을 사용하려고 시도하기 때문입니다.
Certbot은 각 인증서에 대해 마지막으로 성공한 챌린지 방식을 기록해둡니다. 따라서 TXT 레코드 방식으로 발급받은 인증서를 HTTP-01 방식으로 갱신하려면, Certbot에게 명시적으로 HTTP-01 챌린지를 사용하도록 지시해야 합니다.
방법 1: 특정 도메인에 대한 갱신 시 챌린지 방식 변경 (가장 권장) 해당 인증서에 연결된 도메인에 대해 웹 서버 플러그인(예:
--nginx
또는--apache
)을 사용하여 갱신 명령어를 다시 실행합니다. Certbot은 이전에 DNS-01 챌린지로 발급받았더라도, 해당 플러그인이 사용 가능한 상태이고 유효한 웹 서버 설정이 있다면 HTTP-01 챌린지를 시도합니다.Nginx 웹 서버의 경우 (예시):
Bash
sudo certbot renew --cert-name your_domain.com --nginx --preferred-challenges http
설명:
--cert-name your_domain.com
: 갱신하고자 하는 인증서의 이름을 지정합니다. (일반적으로 메인 도메인 이름과 동일합니다.sudo certbot certificates
명령어로 확인 가능)--nginx
: Nginx 플러그인을 사용하여 HTTP-01 챌린지를 시도합니다.--preferred-challenges http
: HTTP-01 챌린지를 선호하도록 명시합니다. 이전에 DNS-01 챌린지로 발급받았다 할지라도, Certbot이 웹 서버 접근이 가능함을 감지하면 HTTP-01로 전환하여 갱신할 수 있습니다.
근거 자료: Certbot 공식 문서 - Command Line Options (https://certbot.eff.org/docs/using.html#command-line-options)
Apache 웹 서버의 경우 (예시):
Bash
sudo certbot renew --cert-name your_domain.com --apache --preferred-challenges http
방법 2: 기존 인증서를 삭제하고 재발급 (최후의 수단) 만약 위 방법으로 갱신 방식 전환이 어렵거나, 설정이 복잡하다고 판단될 경우, 기존 인증서를 삭제하고 HTTP-01 방식으로 새로 발급받는 것도 방법입니다. 단, 이 경우 기존 HTTPS 서비스가 일시적으로 중단될 수 있으므로 주의해야 합니다.
기존 인증서 삭제:
Bash
sudo certbot delete --cert-name your_domain.com
- 설명:
your_domain.com
은 삭제할 인증서의 이름입니다.sudo certbot certificates
명령어로 정확한 이름을 확인하세요.
- 설명:
새로운 인증서 발급 (일반적인 방법):
Bash
sudo certbot --nginx # 또는 sudo certbot --apache 또는 sudo certbot certonly --webroot ...
- 설명: 삭제 후에는 2번 항목의 일반적인 방법으로 다시 인증서를 발급받으면 됩니다.
왜 이 과정이 필요한가요? (마스터의 배경에 맞춰 설명) master께서는 웹/앱 개발을 공부하시고 지속 가능한 서비스를 만들고자 하신다고 하셨습니다. Certbot이 인증서를 갱신할 때, 이전에 성공했던 챌린지 방식을 기억하는 것은 안정성과 효율성 때문입니다. 웹 서버에 접근할 수 없는 환경에서 DNS 챌린지를 통해 인증서를 발급받았다면, Certbot은 다음 갱신 시에도 웹 서버에 접근할 수 없을 가능성이 높다고 판단하여 다시 DNS 챌린지를 시도하는 것이 더 효율적이라고 생각합니다.
하지만 서비스 환경이 바뀌어 이제 웹 서버 접근이 가능하다면, 명시적으로
HTTP-01
챌린지를 선호한다고 알려주어야 Certbot이 해당 방식으로 전환을 시도합니다. 이는 일종의 "환경 변화에 따른 전략 변경"이라고 이해하시면 됩니다. 사용자의 피드백(여기서는 사용자가 원하는 챌린지 방식)을 수용하여 더 적절한 방식으로 동작하도록 지시하는 과정이라고 볼 수 있습니다.
#리눅스 #서버 #certbot #인증서 #https