2020/08/11
certbot+cloudflareでの証明書取得
概要
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"
以上になります。
関連する記事
CloudflareとGCSを組合せて安く静的ファイル配信サーバー(HTTPS)を構築する
CloudflareとGoogle Gloud Storageを組合せて安くHTTPS対応の画像配信の仕組みを構築しました
[Nginx][Free版]cloudflareでユーザーのIPアドレス取得する
CloudflareのProxyを通した場合でもユーザーのIPアドレスを取得できるようにNginxの設定を編集しました
certbot+cloudflareでの証明書取得
certbot certonly manual + cloudflareのAPIでの操作ログ
pm2で環境変数を設定して、オレオレ証明書エラーを回避する
pm2で動かしているNuxt.jsアプリに環境変数を設定して、自己署名証明書のエラーを回避しました