개요

certbot을 이용하여 와일드카드 도메인 인증서를 발급받는 방법을 설명한다.

certbot에서 와일드카드 도메인 인증서를 발급받는 과정은 아래와 같다.

  • certbot에서 TXT 레코드에 추가할 값을 발급
  • 발급받은 값을 도메인의 TXT 레코드에 추가
  • 발급 서버에서 TXT 레코드를 확인함으로써 도메인에 대한 소유권 유무를 확인
  • 인증서 발급

위 과정 중 두 번째는 자동이나 수동으로 진행할 수 있다.

자동으로 발급받는 경우, 사용하는 DNS 서비스에서 API를 지원해주는지를 확인해야 한다. 아래의 링크에서 API 지원 여부를 확인한다.

https://certbot.eff.org/docs/using.html#dns-plugins

여기서는 PowerDNS로 네임서버를 구축한 환경에서 certbot을 통한 와일드카드 도메인 인증서를 자동으로 발급받아 볼 것이다.

수동으로 발급받는 경우에는 certbot에서 등록하라고 준 값을 네임 서버에 TXT 레코드로 추가한 후 certbot 명령어를 계속 진행해서 발급 받기 때문에 여기서 따로 설명하진 않겠다.

사용하는 Apache는 아래의 링크에서 설명하는 방법으로 설치한 버전이다.

[APM설치] httpd 설치하기

테스트 환경

  • CentOS 7.9
  • httpd 2.4.46 (event)
  • OpenSSL 1.1.1k
  • PowerDNS 4.3

플러그인 설치 및 설정

인증서 자동 발급을 위해 certbot에서 네임 서버에 TXT 레코드를 등록할 수 있도록 해야 한다.

이 때 필요한 것은 아래의 세 가지이다.

  • 네임 서버에서 Dynamic DNS Update 지원할 수 있도록 설정되어 있어야 한다.
  • 네임 서버에서 TSIG 키를 생성한다.
  • certbot 플러그인 (certbot-dns-rfc2136 : Dynamic DNS Update를 이용하여 TXT 레코드를 등록시켜주는 플러그인)


첫 번째와 두 번째의 경우 이전에 작성한 포스트를 참고하면 된다.

[PowerDNS] DNS Dynamic Update


이제 플러그인 설치와 기본 설정을 진행하도록 한다.

[root@localhost ~]# snap set certbot trust-plugin-with-root=ok
	
[root@localhost ~]# snap install certbot-dns-rfc2136
certbot-dns-rfc2136 1.15.0 from Certbot Project (certbot-eff✓) installed

[root@localhost ~]# vi /etc/letsencrypt/rfc2136.ini
# Target DNS server
dns_rfc2136_server = 127.0.0.1
# Target DNS port
dns_rfc2136_port = 53
# TSIG key name
dns_rfc2136_name = test1234
# TSIG key secret
dns_rfc2136_secret = Dynamic DNS Update에 사용할 시크릿 값
# TSIG key algorithm
dns_rfc2136_algorithm = HMAC-SHA512
	
[root@localhost ~]# chmod 600 /etc/letsencrypt/rfc2136.ini 

PowerDNS에 Dynamic DNS Update 설정

와일드카드 인증서 발급

[root@localhost letsencrypt]# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini -d *.h2terran.site -d h2terran.site
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-rfc2136, Installer None
Requesting a certificate for *.h2terran.site and h2terran.site
	
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live/h2terran.site/fullchain.pem
  Your key file has been saved at:
  /etc/letsencrypt/live/h2terran.site/privkey.pem
  Your certificate will expire on 2021-08-11. 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

해당 작업을 진행하면 TXT 레코드가 생성된다. 삭제는 수동으로 진행한다.

인증서 확인

[root@localhost ~]# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: h2terran.site
    Serial Number: 3269f64a4838afda5a1c86866962b82e775
    Key Type: RSA
    Domains: *.h2terran.site h2terran.site
    Expiry Date: 2021-08-11 07:12:15+00:00 (VALID: 44 days)
    Certificate Path: /etc/letsencrypt/live/h2terran.site/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/h2terran.site/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

인증서 갱신

발급 받은 인증서의 유효기간은 발급 받은 이후로 90일까지이며, 기본적으로 인증서 만료일이 한달 이내로 남은 시점일 때부터 갱신이 가능하다.

아래의 파일에서 갱신 가능일을 수정할 수 있다.

[root@localhost ~]# vi /etc/letsencrypt/renewal/www10.h2terran.xyz.conf 
# renew_before_expiry = 30 days
-> 아래와 같이 변경
renew_before_expiry = 90 days


crond를 이용하여 매월 1일에 인증서를 재발급받고 아파치 적용을 위해 재실행을 진행하게 설정한다.

[root@localhost ~]# crontab -l
0 0 1 * * certbot renew --apache-ctl=/usr/local/apache2/bin/apachectl

참고 자료