[Docker] Let's Encrypt 와일드카드 인증서 발급받기

이젠 필수인 SSL, Docker를 통해 간편하게 발급 받아봅니다

[Docker] Let's Encrypt 와일드카드 인증서 발급받기

필자는 Namecheap에서 도메인을 발급받아 Cloudflare DNS 서비스를 이용하기 때문에 Cloudflare DNS를 기준으로 글을 작성했습니다

와일드카드 인증서와 일반 인증서의 차이점은?

일반 인증서의 경우 루트 도메인과 별도로 서브 도메인을 일일히 적어서 인증서를 발급받는다.

따라서 인증서 정보를 보면 루트 도메인과 서브 도메인이 하드 코딩 되어있기에 발급받은 후에 새로운 서브 도메인에 SSL을 적용하기 위해서는 새로운 인증서를 발급받아야 한다.

반면 와일드카드 인증서의 경우 *.seongmin.dev 로 인증서를 발급받기 때문에 언제든지 다른 서브 도메인에 SSL을 적용할 수 있다.

Cloudflare API키 파일 생성하기

Cloudflare 페이지에서 Global API Key를 확인한다.

그리고 ~/.secrets/certbot/cloudflare.ini 을 생성한다.

# ~/.secrets/certbot/cloudflare.ini

dns_cloudflare_email = email@email.com
dns_cloudflare_api_key = API_KEY

이후 보안을 위해 권한을 설정한다.

chmod 600 ~/.secrets/certbot/cloudflare.ini

인증서 발급받기

1. certbot 이미지 실행하기

docker run --rm -it --name certbot \
    -v ~/docker/certbot/seongmin.dev/etc:/etc/letsencrypt \
    -v ~/docker/certbot/seongmin.dev/var:/var/lib/letsencrypt \
    -v ~/.secrets/certbot/cloudflare.ini:/cloudflare.ini \
    certbot/dns-cloudflare:latest \
    certonly \
    --dns-cloudflare \
    --dns-cloudflare-credentials /cloudflare.ini \
    -d seongmin.dev \
    -d *.seongmin.dev

만약 ARM 인스턴스라면 아키텍쳐에 맞게 latest 이미지 태그를 arm32v6-latest 또는 arm64v8-latest로 지정하면 된다.

-v 쪽에 있는 디렉토리와 -d 에 있는 도메인만 수정하면 된다.

2. 이메일 주소 입력

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

여기서 적은 이메일로 인증서 만료까지 남은 일수를 알려주는 메일이 온다.

3. 약관 동의

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf.
You must agree in order to register with the ACME. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

인증서 발급에 대한 약관 동의 여부이다. 동의를 해야 인증서 발급이 진행된다.

4. 이메일 수신 동의

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully
issued, to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the
non-profit organization that develops Certbot? We'd like to send
you email about our work encrypting the web, EFF news, campaigns,
and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:

about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom 에 해당하는 이메일 수신에 대한 동의이다.

동의하지 않아도 인증서 발급은 가능하기 때문에 거부했다.

5. 발급

Account registered.
Requesting a certificate for domain.TLD *.domain.TLD
Performing the following challenges:
dns-01 challenge for domain.TLD
dns-01 challenge for domain.TLD
Waiting 10 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/seongmin.dev/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/seongmin.dev/privkey.pem
   Your certificate will expire on 2021-05-30. 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

이렇게하면 발급이 완료된다.

인증서는 /etc/letsencrypt 를 마운트한 디렉토리 아래에 /archive/domain.TLD 에 위치한다.

인증서 갱신

인증서 갱신은 발급시 입력했던 정보가 저장되어 있기때문에 간단하다.

docker run --rm -it --name certbot \
    -v ~/docker/certbot/seongmin.dev/etc:/etc/letsencrypt \
    -v ~/docker/certbot/seongmin.dev/var:/var/lib/letsencrypt \
    -v ~/.secrets/certbot/cloudflare.ini:~/cloudflare.ini \
    certbot/dns-cloudflare:latest \
    renew

여기도 마찬가지로 ARM 인스턴스라면 아키텍쳐에 맞게 latest 이미지 태그를 arm32v6-latest 또는 arm64v8-latest로 지정하면 된다.

만약 갱신을 시뮬레이션 해보고 싶다면 renew 대신 renew --dry-run을 통해서 확인할 수 있다.