LetsEncrypt Certbot Cloudflare API를 통한 무료 와일드카드 인증서 발급하기

(Last Updated On: January 31, 2020)

LetsEncrypt 인증서를 와일드카드 (*) 로 받는 방법이다.

LetsEncrypt CloudFlare 플러그인 설치

yum install certbot python2-certbot-dns-cloudflare

CloudFlare API키 파일

CloudFlare 를 이용한 LetsEncrypt 인증을 사용하려면 CloudFlare에서 API 키를 받아야한다.
클라우드플레어 My Profiles 에서 발급 및 확인할 수 있다.
Cloudflare API 를 보관해둘 파일을 지정한다.
지정주소는 개인이 각자 보관하면 되지만 ~/.secrets/certbot/cloudflare.ini  에 저장하겠다.

# Cloudflare API credentials used by Certbot
dns_cloudflare_email = [email protected]
dns_cloudflare_api_key = abcdefg123456

API 키는 도메인을 수정할 수 있는 민감한 키기 때문에, 다른 사용자가 볼 수 없도록 권한을 설정해준다.
디렉토리 700, 파일 600

Certbot 을 이용해 인증서 발급

아래의 명령에 -d 부분을 자신의 도메인으로 변경후, cloudflare 설정파일 경로까지 확인하고 명령을 실행시킨다.

certbot certonly \
-d kerus.net \
-d *.kerus.net \
--server https://acme-v02.api.letsencrypt.org/directory \
--dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
--preferred-challenges dns-01
생성완료
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/kerus.net/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/kerus.net/privkey.pem

생성된다.

Centos 7 cron에 등록하여 자동갱신

sudo yum install crontabs
crontab -e
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

ㅋㅋ 인증서는 자동갱신인데 nginx에서 인증서를 리로딩해주진 않는다.

crontab에 3개월마다 nginx -s reload를 넣으면 된다는 지인의 의견이 있다.

만, 만료 30일이내의 경우에만 인증서 재발급이 되므로, 14일마다 reload 해주는게 좋을 법하다.
certbot 인증서 발급시 post hook으로 nginx 리로드를 하는 방법도 있지만, 오작동 이슈가 많은 것 같아보인다

certbot renew --renew-hook "systemctl reload nginx"

 

Experimental: LetEncrypt Certbot을 통한 ECC (ECDSA) 인증서를 발급하기

ECC 인증서 발급은 Certbot 에서 현재 정식적으로 지원하지 않기 때문에, 자동리뉴얼 이라던가가 불가능하다.

OPENSSL="/usr/local/ssl/openssl.cnf"
OPENSSL_CN="kerus.net"
OPENSSL_SAN="DNS:kerus.net, \
DNS:kerus.net, \
DNS:*.kerus.net, \

cat ${OPENSSL} > /tmp/openssl.txt
printf "[SAN]\n" >> /tmp/openssl.txt
printf "subjectAltName=${OPENSSL_SAN}" >> /tmp/openssl.txt

openssl ecparam -genkey -name P-256 > ecckey.pem
openssl req -new -sha256 \
-key ecckey.pem \
-subj "/C=US/ST=CA/O=Acme, Inc./CN=${OPENSSL_CN}" \
-reqexts SAN \
-config /tmp/openssl.txt \
-out ecc.csr

letsencrypt certonly --text --agree-tos -m "[email protected]" \
--server https://acme-v02.api.letsencrypt.org/directory \
--dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini \
--preferred-challenges dns-01 \
--csr ./ecc.csr