📜

【Let’s Encrypt】DNSのAPIを使用して証明書更新を簡略化する

2024/09/21に公開

はじめに

Let's Encryptの証明書は有効期限が3ヶ月と有料のものと比較すると短めです。これも無料故なのかもしれませんが、個人開発としては非常に助かっています。

さて、3ヶ月となると1年に4回は更新が必要になります。
更新の際に必要となるDNSチャレンジが少々手間なので、VPS側で公開されているDNSのAPIを使用して簡略化しようと思います。

環境

Ubuntsu(jqコマンド導入済み)
certbot
ConoHa VPS
Let’s Encrypt(ワイルドカード証明書)

ConoHaのAPI仕様

https://doc.conoha.jp/api-vps2/
https://doc.conoha.jp/api-vps3/

公開されている仕様の中から今回は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ファイル単体で動作確認をしましょう…。

参考

https://ryuden.org/conoha-api-dns-auto/

Discussion