LoginSignup
11
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-18

本記事では、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)は未確認です。

参考サイト

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8