📜
【Let’s Encrypt】DNSのAPIを使用して証明書更新を簡略化する
はじめに
Let's Encryptの証明書は有効期限が3ヶ月と有料のものと比較すると短めです。これも無料故なのかもしれませんが、個人開発としては非常に助かっています。
さて、3ヶ月となると1年に4回は更新が必要になります。
更新の際に必要となるDNSチャレンジが少々手間なので、VPS側で公開されているDNSのAPIを使用して簡略化しようと思います。
環境
Ubuntsu(jqコマンド導入済み)
certbot
ConoHa VPS
Let’s Encrypt(ワイルドカード証明書)
ConoHaのAPI仕様
公開されている仕様の中から今回はDNS APIを使用します。
VPS環境によってv2、v3を使用するか変わるため各自の環境に合わせてください。
更新コマンド
下記の通りです。発行時は--manual-auth-hookは使用していません。
certbot certonly --manual \
--preferred-challenges dns \
-d *.example.com \
-d example.com \
-m <任意のメアド> \
--agree-tos \
--manual-public-ip-logging-ok \
--manual-auth-hook "/任意ディレクトリ/dns_authenticator.sh"
--manual-auth-hook
--manual-auth-hookは_acme-challengeの認証の前にスクリプトを指定するもので、今回はこのオプションを使用し、DNSへの値登録を簡略化しています。
シェル
dns_authentication.sh
#!/bin/bash
# DNS PROVIDER INFO
API_USER_NAME="xxxxx"
API_USER_PASSWORD="xxxxx"
API_TENANT_ID="xxxxx"
API_DOMAIN_ID="xxxxx"
# CERTBOT INFO
DOMAIN="$CERTBOT_DOMAIN" #certbotより取得できる変数
TOKEN="$CERTBOT_VALIDATION" #certbotより取得できる変数
RECORD="_acme-challenge.$DOMAIN."
# GET TOKEN
access_token=`curl -X POST \
-H "Accept: application/json" \
-d "{\"auth\":{\"passwordCredentials\":{\"username\":\"$API_USER_NAME\",\"password\":\"$API_USER_PASSWORD\",\"tenantId\":\"$API_TENANT_ID\"}}}" \
https://identity.tyo3.conoha.io/v2.0/tokens | jq -r ".access.token.id"`
# ADD RECORD
result=`curl -i -X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Auth-Token: $access_token" \
-d "{\"name\": \"$RECORD\", \"type\": \"TXT\", \"data\": \"$TOKEN\"}" \
https://dns-service.tyo3.conoha.io/v1/domains/$API_DOMAIN_ID/records`
# RESULT
echo "result: $result"
実行
シェル作成後、改めて冒頭の更新コマンドを実行すると…
Successfullyと表示され、実際にページの証明書を確認すると…
更新されました~
注意
動作確認を冒頭の更新コマンドで実施していたのですが、どうやら5回エラーを出してしまうと1週間関連ドメインへの作業ができなくなってしまうようです。
shファイルを実行するテストは、まずはshファイル単体で動作確認をしましょう…。
参考
Discussion