Certbot + Cloudflare 연동
Certbot으로 SSL 인증서 발급 시, Cloudflare의 API 를 사용하여 DNS 인증을 자동화하는 방법을 소개합니다.
일반적으로 SSL 인증서를 발급 받기 위해서는 업체를 통해 유료로 발급 받는 경우가 많다. 하지만, 개인 사이트 등 영세한 사이트들은 이 비용이 크게 와닿게 되는데, 여기서 Let's Encrypt가 등장한다. HTTPS 보급을 위해서 다양한 방법 중 하나를 이용해서 웹 사이트의 소유를 증명하면, 무료로 SSL 인증서를 발급해준다.
웹 사이트의 소유를 증명하는 방법은 다양하다. DNS TXT Record를 통해서 소유를 증명하거나 웹 서버에 랜덤한 문구를 업로드(Webroot)하는 방법이 있다. 후자의 경우 서브도메인에서만 받을 수 있다는 단점이 있다. 만일, 와일드카드 인증서를 받고 싶다면 DNS TXT Record를 통해서만 인증이 가능하다.
그리고, Let's Encrypt에서 제공하는 SSL 인증서는 유효기간이 90일로 설정되어 있다. 즉, 지속적으로 HTTPS 사이트를 운영하기 위해서는 SSL 인증서를 신경 써서 갱신해주어야한다. 그러니 운영하는 입장에서는 자동화하는 것을 생각하기 쉽다. webroot 인증으로 진행하는 경우에는 쉽게 CronJob을 설정하면 된다.
하지만, DNS TXT Record를 통해 인증한 경우, 직접 TXT Record를 등록해야하기에 자동화가 불가능하다고 생각할 수 있지만 방법이 있다.
도메인 업체에 따라서 Certbot 공식 Plugin을 제공하는 Provider가 있고 Third Party에서 제작/지원하는 Plugin이 있는데, 이 글에선 Cloudflare를 기준으로 한다. Cloudflare를 사용하지 않는 경우 Certbot 문서를 보면, 지원하는 Release가 있으니 참고하자.
환경
- Docker
- Docker compose
- Cloudflare
이 글은 Certbot Docker Image를 이용해 인증서를 발급한다.
Steps
Cloudflare API Token 생성
먼저 Cloudflare에 진입하여 API Token 을 생성해준다.
Cloudflare에 로그인한 뒤, 오른쪽 위 계정 -> My Profile 순으로 진입한다.
'API Tokens' 탭에 진입하고, 'Create Token' 버튼을 클릭한다.
'Edit zone DNS'에 있는 'Use template'을 클릭한다. Certbot은 DNS에 TXT Record만 추가해 다른 권한은 불요하다.
세부 권한을 설정할 수 있는 화면이 등장한다. Permissions는 둬도 된다. 그 외는 상황에 맞게 설정하면 된다. 특히, Client IP Address Filtering은 설정하면 나쁠게 없어보인다.
API Token이 등장하는데, 한 번만 등장하므로 메모해두자.
서버에서
Certbot을 사용할 서버로 넘어와서 구성 파일을 작성해주면 된다. 먼저, cloudflare.ini 파일을 만들고 아래와 같이 작성한다.
dns_cloudflare_api_token = <아까 생성한 Token>
대망의 docker-compose.yaml 이다.
위와 같이 작성하는데 command 부분에 이메일과 도메인을 상황에 맞게 변경하면 된다. 와일드카드 도메인 발급을 원하는 경우 '\*.domain.com' 이런식으로 escape 구문을 활용하여 적는다.
'docker compose up' 명령어를 통해 발급받으면 동일 디렉터리의 certs/live/<domain> 에서 발급된 인증서를 볼 수 있다.
'--dns-cloudflare-propagation-seconds 120' 옵션은 등록 요청 후 120초를 기다린 뒤 확인하는 옵션이다. 기본 값으로 하면 반영이 되지 않은 경우가 있어 임의로 설정했다.
자동 갱신 구성
자동 갱신 구성하는 방법도 간단하다. docker-compose.yaml 을 보면 letsencrypt의 설정 파일을 로컬에 저장하는 사실을 볼 수 있다. 이 파일에는 renewal을 위한 구성 파일들이 위치해 있으므로 구성을 유지한 채 command 를 변경하면 된다.
command: renew
command를 변경하면, 저장된 인증서 갱신을 시도하게 된다. 스케줄을 설정할려면 crontab 을 이용해 docker compose를 실행하면 된다.
작동을 테스트하고 싶다면 '--dry-run'이라는 옵션을 넣어서 할 수 있다. 이 과정에는 생각보다 느릴 수 있다. 너무할정도로 느린 것이 정상이므로 Background에서 수행하길 바란다.