목차

Let's Encrypt(CertBot) Wildcard Certificates

이강우 2020/12/13 14:36

이 문서는 Let's Encrypt에서 발급해주는 와일드카드 인증서를 발급받는 방법을 설명한다.

사전준비 사항

와일드카드 인증서는 당연하게도 도메인에 대한 소유 권한이 있어야 한다.
인증서 발급 절차 중간에 도메인 정보를 수정하여야 하는 절차가 존재한다.

이렇게 준비되었다 하더래도 또다른 문제가 있다.
바로 유효기간 90일(3개월)이 지난 이후 갱신할때가 문제이다.
이부분은 아래 문제점 부분에서 설명한다.

발급절차

certbot certonly --manual --preferred-challenges dns -d "koov.kr" -d "*.koov.kr" 명령어를 통해서 인증서 발급 절차를 시작한다.

root@proxy:~# certbot certonly --manual --preferred-challenges dns -d "koov.kr" -d "*.koov.kr" 
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for koov.kr
dns-01 challenge for koov.kr

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

인증서 발급에 대한 약관이 나오며 동의(Y)를 눌러 진행한다.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.koov.kr with the following value:

NFH7_ZDQmi_Kz4A_M-SWzXrwJuTVQ1zDEJooI1gQ2pw

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

해당 도메인에 대한 권한을 확인하기 위해 _acme-challenge.koov.kr 레코드에 대해 제공된 NFH7_ZDQmi_Kz4A_M-SWzXrwJuTVQ1zDEJooI1gQ2pw 키값을 TXT 필드로 등록하라는 메시지가 나온다.

앞서 설명한것처럼 자체 운영 DNS이면 자체 DNS의 해당 필드값을 등록하여주고 재기동 하여 적용해준다.
업체 DNS서비스를 이용한다면 업체에서 제공하는 DNS 레코드 관리 기능을 이용하여 등록하여 준다.

다음으로 진행하기 전에 제대로 등록됐는지 확인하기 위해 별도의 시스템에서 아래 명령어로 확인해본다.

리눅스 dig 명령어 사용시

root@proxy:~# dig _acme-challenge.koov.kr TXT

; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> _acme-challenge.koov.kr TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 719
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.koov.kr.	IN	TXT

;; ANSWER SECTION:
_acme-challenge.koov.kr. 179	IN	TXT	"NFH7_ZDQmi_Kz4A_M-SWzXrwJuTVQ1zDEJooI1gQ2pw"

;; Query time: 134 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec 13 14:47:14 KST 2020
;; MSG SIZE  rcvd: 164

리눅스 host 명령어 사용시

root@proxy:~# host -t txt _acme-challenge.koov.kr
_acme-challenge.koov.kr descriptive text "NFH7_ZDQmi_Kz4A_M-SWzXrwJuTVQ1zDEJooI1gQ2pw"

윈도우/리눅스 nslookup 명령어 사용시

Microsoft Windows [Version 10.0.19041.685]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\Users\KooV>nslookup
기본 서버:  dns.google
Address:  8.8.8.8

> set type=TXT
> _acme-challenge.koov.kr
서버:    dns.google
Address:  8.8.8.8

권한 없는 응답:
_acme-challenge.koov.kr text = "NFH7_ZDQmi_Kz4A_M-SWzXrwJuTVQ1zDEJooI1gQ2pw"

위와 같이 ANSWER SECTION에 해당 TXT 레코드 값이 나와야 한다.

그리고 다음으로 진행하도록 한다.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.koov.kr with the following value:

D1FHFn5avBVNyoMoQlNVuhrbhEheyaKyWwzm9rauW00

Before continuing, verify the record is deployed.
(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

다시 두번째 TXT 레코드를 등록하라고 나온다.
여기서 주의할 점은 앞서 등록한 TXT 레코드를 수정하거나 삭제하면 안된다.
두번째 TXT레코드를 추가로 등록 하라는것이다.
동일한 _acme-challenge 이름으로 여러개의 TXT 레코드를 등록할 수 있으므로 추가로 등록해주면 된다.

추가 등록해주고 위에서 설명한 방법으로 제대로 등록됐는지 다시한번 확인한다.

root@proxy:~# dig _acme-challenge.koov.kr TXT

; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> _acme-challenge.koov.kr TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 719
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.koov.kr.	IN	TXT

;; ANSWER SECTION:
_acme-challenge.koov.kr. 179	IN	TXT	"NFH7_ZDQmi_Kz4A_M-SWzXrwJuTVQ1zDEJooI1gQ2pw"
_acme-challenge.koov.kr. 179	IN	TXT	"D1FHFn5avBVNyoMoQlNVuhrbhEheyaKyWwzm9rauW00"

;; Query time: 134 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Dec 13 14:47:14 KST 2020
;; MSG SIZE  rcvd: 164

위와같이 2줄의 TXT 레코드가 출력되어야 한다.

정상적으로 등록된것이 확인됐다면 다음으로 진행한다.

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/koov.kr/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/koov.kr/privkey.pem
   Your cert will expire on 2021-03-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

인증서 발급이 완료 되었다.

문제점

이 방식으로 wildcard 인증서를 받게 되면 갱신시 아래와 같은 중요한 문제점이 있다.

와일드 카드 인증서를 받는 방식은 DNS 소유권을 확인하는 과정이 필요하기 때문에 갱신시에도 DNS _acme-challenge TXT 값을 매번 갱신해서 소유권을 확인하도록 되어있다.
보통 도메인 대행업체를 이용해서 사용하는 대부분의 경우 이 TXT 레코드를 자동으로 변경해주는 기능이 없기 때문에 인증서 자동갱신이 되지 않는다.

certbot 에서 제공하는 TXT 레코드 자동갱신 플러그인은 아래와 같이 다양한 종류를 지원한다.

위에서 지원하지 않는 일반 도메인대행업체의 DNS서버를 이용하여 와일드카드 인증서를 받았다면 자동갱신은 불가능하다고 보면 된다.
따라서 자동갱신이 가능한 AWS Route53, CloudFlare, Google DNS 등의 서비스를 이용하면 편하게 갱신할 수 있다는점을 참고하기 바란다.

또한 직접 DNS서버(bind같은)를 운영한다면 rfc2136 플러그인을 사용하여 갱신도 가능하다.

Cloudflare DNS를 이용한 와일드카드 인증서

관련문서:https://certbot-dns-cloudflare.readthedocs.io/en/stable/

Cloudflare DNS를 이용중인경우에는 Cloudflare DNS API를 이용하여 와일드카드 인증서를 편하게 발급받을수 있다. 또한 갱신도 API를 통해 자동으로 처리되기 때문에 편리하다.

먼저 필요한것은 certbotcloudflare plugin을 설치하여야 한다.

$ apt install python3-certbot-dns-cloudflare

이제 Cloudflare DNS에 본인의 사이트를 등록한 후 API를 이용하기 위한 API Token을 발급받는다.

사이트선택API 토큰토큰생성(영역 DNS 편집) 으로 토큰을 생성한다. 생성된 토큰값을 복사한다.

복사한 토큰값을 cloudflare.ini 파일로 저장한다. 이 예제에서는 ~/.secrets/certbot/cloudflare.ini 경로에 생성하였다.

# Cloudflare API token used by Certbot
dns_cloudflare_api_token = AABBCCDDEEFF..XXYYZZ

이후 해당 토큰을 이용하여 cloudflare plugin을 통해 와일드카드 인증서를 발급받도록 한다.

$ certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini -d "koov.kr" -d "*.koov.kr"

발급이 완료되었다.

참조링크