2020/08/11

certbot+cloudflareでの証明書取得

sslcloudflare

概要

cloudflareにAPIが公開されており、これによって、TXTレコードなどの追加が自在にできます。
この機能を利用して、certbot(Let’s Encryptの便利コマンド)はpluginを提供しており、
コマンド一発で、cloudflareと連携しつつ、証明書の作成を行うモジュールが提供されています👍

参考

・・ですが、自分の環境だと動きませんでした・・

  • certbotのversionが古い?

などが原因?という記事はよく見るのですが・・結局解決できませんでした。

結局は、CloudflareがEnd to EndのSSLで自己署名証明書で問題ないという仕様だったため、Let’s Encryptをやめて、自己署名証明書を作って対応することにしました。
(有効期限を25年とかにして、更新の心配もしなくて済むので楽です)

とはいえ、cloudflareのAPIとcertbotで試したログがあるので残しておきます。

作業内容

CloudflareでAPI Keyを発行

  • CloudflareでAPIの設定を行います。API Keyというものが発行されるので、それをメモしておきます。

certbotコマンドを実行

以下のようにしてwildcardのものを発行しました。

certbot certonly \
  --dry-run \
  --manual \
  --preferred-challenges dns \
  -d *.kumano-te.com \
  --server https://acme-v02.api.letsencrypt.org/directory

certbot certonly \
  --manual \
  --preferred-challenges dns \
  -d *.kumano-te.com \
  --server https://acme-v02.api.letsencrypt.org/directory

コマンドの途中で、TXTレコードを追加させるように指示が出るので、別のターミナルを開いて以下の処理を行います。

TXTレコードの追加

zone_identifier=please-check-zone-identifier-in-cloudflare-console
[email protected]
cloudflare_api_key=cloudflare-api-key
acme_challenge_content=<ここに certbot certonlyコマンドで出力される_acme-challengeの内容を設定>

curl -X POST "https://api.cloudflare.com/client/v4/zones/${zone_identifier}/dns_records" \
     -H "X-Auth-Email: ${cloudflare_email}" \
     -H "X-Auth-Key: ${cloudflare_api_key}" \
     -H "Content-Type: application/json" \
     --data "{\"type\":\"TXT\",\"name\":\"_acme-challenge.kumano-te.com\",\"content\":\"${acme_challenge_content}\",\"ttl\":1,\"proxied\":false}"

DNSを確認

nslookup -q=txt _acme-challenge.kumano-te.com

問題なく確認できたら、certbot certonly の処理を続行させて完了させます。

TXTレコードを削除

# DNSを削除
curl -X GET "https://api.cloudflare.com/client/v4/zones/${zone_identifier}/dns_records?type=TXT&name=_acme-challenge.kumano-te.com&page=1&per_page=20&order=type&direction=desc&match=all" \
     -H "X-Auth-Email: ${cloudflare_email}" \
     -H "X-Auth-Key: ${cloudflare_api_key}" \
     -H "Content-Type: application/json"
# output of the GET response
dns_identifier=id-got-by-output-of-the-previous-request

curl -X DELETE "https://api.cloudflare.com/client/v4/zones/${zone_identifier}/dns_records/${dns_identifier}" \
     -H "X-Auth-Email: ${cloudflare_email}" \
     -H "X-Auth-Key: ${cloudflare_api_key}" \
     -H "Content-Type: application/json"

以上になります。