Edited at

Let's Encrypt の SSL 証明書を CloudFlare を使って DNS-01 で取得する

More than 3 years have passed since last update.

本記事では、Let's Encrypt、CloudFlare、DNS-01 についての説明は一切ありません。また、インフラ初心者が執筆している(覚書)のでご注意ください。


CloudFlare の API Key を取得

CloudFlare の My Account ページにアクセスします。そのままページをスクロールすると API Key という項目があり、右側に View API Key というボタンがあるのでクリックします。表示された、API Key をメモしておいてください。


Let's Encrypt の SSL 証明書を取得する

以下がコマンド一覧です。pip コマンドがないよ!というエラーが出力された場合、$ yum -y install python python-pip という感じで、インストールしてください。だいたいの場合、python はインストールされていると思うので、python-pip だけで大丈夫だと思います。

所々にコメントを入れていますので、参考にしてください。

$ git clone https://github.com/lukas2511/letsencrypt.sh /usr/local/letsencrypt.sh

$ git clone https://github.com/kappataumu/letsencrypt-cloudflare-hook /usr/local/letsencrypt.sh/hooks/cloudflare
$ cd /usr/local/letsencrypt.sh/
$ pip install -r ./hooks/cloudflare/requirements.txt # Python 3 用 ? CloudFlare Hook のマニュアル必読
$ pip install -r ./hooks/cloudflare/requirements-python-2.txt # Python 2 用 ? CloudFlare Hook のマニュアル必読
$ export CF_EMAIL='YOUR CLOUDFLARE LOGIN EMAIL ADDRESS'
$ export CF_KEY='YOUR CLOUDFLARE API KEY'
$ export CF_DNS_SERVERS='8.8.8.8 8.8.4.4' # 必要に応じて実行 CloudFlare Hook のマニュアル必読
$ vi ./domains.txt # 半角スペース区切りでドメインをリスト化 letsencrypt.sh のマニュアル必読
example.jp www.example.jp
$ mkdir /usr/local/letsencrypt.sh/.acme-challenges # アーカイブ用ディレクトリの作成
$ /usr/local/letsencrypt.sh/letsencrypt.sh -c -t dns-01 -k '/usr/local/letsencrypt.sh/hooks/cloudflare/hook.py'


発行される証明書


  • サーバ証明書(公開鍵)

    /usr/local/letsencrypt.sh/certs/example.jp/cert.pem

  • 中間証明書

    /usr/local/letsencrypt.sh/certs/example.jp/chain.pem

  • サーバ証明書 + 中間証明書

    /usr/local/letsencrypt.sh/certs/example.jp/fullchain.pem

  • 秘密鍵

    /usr/local/letsencrypt.sh/certs/example.jp/privkey.pem


Let's Encrypt の SSL 証明書を自動取得する

Cron 登録用のスクリプトを作成。

$ vi /usr/local/letsencrypt.sh/cron.sh

以下をペースト。letsencrypt.sh のオプションの詳細は、letsencrypt.sh のマニュアル、または help コマンドを実行してください。

#!/usr/bin/env bash

export CF_EMAIL='YOUR CLOUDFLARE LOGIN EMAIL ADDRESS'
export CF_KEY='YOUR CLOUDFLARE API KEY'

/usr/local/letsencrypt.sh/letsencrypt.sh \
-c \
-x \
-t dns-01 \
-k '/usr/local/letsencrypt.sh/hooks/cloudflare/hook.py'

/usr/local/letsencrypt.sh/letsencrypt.sh -gc

systemctl restart nginx

実行権限を付与

$ chmod +x /usr/local/letsencrypt.sh/cron.sh

Job を登録

$ crontab -e

0 4 1 * * /usr/local/letsencrypt.sh/cron.sh >> /usr/local/letsencrypt.sh/cron.log 2>&1

以上で終了です。


あとがき

Certbot を使用した SSL 証明書の取得の場合、サーバーの公開ディレクトリに .well-known というディレクトリが作られたりして、何だか気になっていました。DNS-01 を使用した方法の場合、そういった何だか気になるディレクトリが作られたりしないので、筆者個人としては、DNS-01 を使用した方法の方がいいなーと思います。また、両方トライしてみた経験から、DNS-01 を使用した方法の方が、簡単に感じました。

※ プラグインに webroot を使用した場合、.well-known というディレクトリが作られます。その他のプラグイン(Apache、nginx、etc)は未確認です。


参考サイト