Let's Encrypt + Cloudflare によるワイルドカード証明書用コンテナの構築

## はじめに
[前回](https://qiita.com/motuneko253/items/4db8c92e36eab78ad23e)の記事に引き続き、Raspberry Pi上の機能移植としてLet's Encryptによる証明書更新の機能をDockerにて構築します。

前回CloudflareによるDDNSのドメイン更新を行っていましたが、そのドメインを使用してLet's Encryptの証明書取得を行います。
私個人の証明書取得の際の要件は以下の2つです。
1. DNS認証を使用すること(現在自身のドメインでは外部への公開を行っていないため)
1. ワイルドカード証明書であること

今回機能を移植するに辺り、上記2つを満たすものを探したのですが、見つからなかったためコンテナで自作を行いました。

使う方などそうそういないでしょうが、Githubに公開しました。

https://github.com/motuneko253/letsencrypt_cloudflare_sample

## 環境
### バージョン情報
前回に引き続きDockerは現在最新の物を使用していきます。
```ruby:コマンド
$ docker -v
Docker version 27.0.3, build 7d4bcd8
```

## 今回実施する内容
先にDockerの情報を記載してしまいましたが、今回Let's Encryptの証明書更新をするに辺り、「certbot」および「python3-certbot-dns-cloudflare」を使用します。
まず、「certbot」とはLet's Encryptの無料のSSL/TLS証明書を自動的に取得、設定、更新するためのオープンソースのツールになります。
次に、「python3-certbot-dns-cloudflare」とは、certbotのプラグインの1つで、Cloudflare DNSを使用してドメインの更新などを自動的に処理するプラグインです。

端的に解説すると、上記2つを使用して証明書の取得を実行。
以降定期的にcertbotを起動して証明書更新の有無を確認するのが、今回私が作成した物になります。
以下Dockerの中身の解説含めご紹介させて頂きます。
(夜中に半寝ぼけで作ったせいか若干何だこれという処理になっています…。そのうち直す予定です…。)

## CloudflareにてユーザーAPIトークンの発行
今回もCloudflareのAPIトークンが必要となります。
[前回](https://qiita.com/motuneko253/items/4db8c92e36eab78ad23e)の記事で発行した、APIトークンの値を今回そのまま流用したいと思います。
発行の仕方などは前回の記事をご確認お願いします。

## docker-compose.ymlの修正
docker-compose.ymlだけを修正すれば大丈夫なようにしていますが、私個人でしか使う想定ではないためだいぶごり押しした作りとなっています。

修正ポイントとしては以下の通りです。
- API_TOKEN：Cloudflareにて取得したAPIトークンを記載します。
- DOMAIN：発行対象のドメイン名を記載します。例えば「example.com」になります。
- SUBDOMAIN：サブドメインという表現が正しくないような気がしますが、「DOMAIN」以外に一緒に対象としたいドメイン名を記載します。「*.example.com」などを想定しています。
- EMAIL：発行者のメールアドレスを記載します。
- WAIT_TIME：CloudflareにてACMEの更新後どれくらい待機するかの秒数を記載します。デフォルトだと10秒ですが、10秒だと反映されていないケースがあったため20秒としています。
- entrypoint：コマンドに「sleep 10d」と記載があるのですが、ここの値を変更すると更新の頻度を調節できます。10dだと10日毎に更新有無を確認します。
本当は変数化したり処理の無駄を感じる所ですが、後日改めて直させてください。

```yaml:docker-compose.yml
services:
  letsencrypt:
    build:
      context: /work/letsencrypt/letsencrypt
      dockerfile: Dockerfile
    networks:
      - wp_net_letsencrypt
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
    entrypoint: "/bin/bash -c 'trap exit TERM; while :; do /root/certbot_install.sh; sleep 10d & wait $${!}; done;'"
    restart: always
    environment:
      - API_TOKEN=[APIトークン]
      - DOMAIN=[ドメイン名]
      - SUBDOMAIN=[サブドメイン名]
      - EMAIL=[メールアドレス]
      - WAIT_TIME=20
      - TZ=Asia/Tokyo
networks:
  wp_net_letsencrypt:
    driver: bridge
```
## Dockerの起動
上記変数を設定していただければ、ホストOS上の「/etc/letsencrypt」上に証明書関連のフォルダなどが生成されています。
```bash
# ls -l /etc/letsencrypt/live/[ドメイン名]/
合計 4
-rw-r--r-- 1 root root 692  7月 18 22:55 README
lrwxrwxrwx 1 root root  41  7月 18 22:55 cert.pem -> ../../archive/[ドメイン名]/cert1.pem
lrwxrwxrwx 1 root root  42  7月 18 22:55 chain.pem -> ../../archive/[ドメイン名]/chain1.pem
lrwxrwxrwx 1 root root  46  7月 18 22:55 fullchain.pem -> ../../archive/[ドメイン名]/fullchain1.pem
lrwxrwxrwx 1 root root  44  7月 18 22:55 privkey.pem -> ../../archive/[ドメイン名]/privkey1.pem
```

## 最後に
記事にするつもりではいたのですが、忘れる前に書かねば！という気持ちから若干未完のまま世に放出することをお許しください…。
私は外部公開していない自宅内の環境なのにフルドメインで証明書を適用し楽しんでいます。
皆さんもぜひよい証明書ライフ？をお送りください！

## 参考サイト
・Ubuntu 20.04 certbot-dns-cloudflareでワイルドカード証明書を取得、更新
https://eggpan.net/post/ubuntu-certbot-dns-cloudflare/

・Welcome to certbot-dns-cloudflare’s documentation!
https://certbot-dns-cloudflare.readthedocs.io/en/stable/

・CloudflareのDNSを使ってCertbotで証明書を発行する
https://0sn.net/posts/20220217/cloudflaredns-certbot/

・docker環境で let's encrypt のssl証明書を取得する
https://qiita.com/mttt/items/aa2ba3a0677a803d0436