Value Domain APIを使い、certbotでワイルドカード認証をするためのメモ。
環境
- FreeBSD 14.1
- certbot 2.11.0
- Value Domain API (特設サイト)
設定方法
APIキーを入手
バリュードメインAPIのページで、APIを使用するホストのIPアドレスを指定してAPIキーを発行する。
/usr/local/vdapi
ディレクトリを作成し、発行したAPIを apikey.txt
というファイルに保存する。
自動登録用スクリプトを作成
/usr/local/vdapi/value-domain-hook.py
ファイルを次の内容で作成し、ファイル実行権を755にしておく。
#!/usr/bin/env python3
import os
import sys
import json
import requests
import time
from pathlib import Path
api_key = ""
api_endpoint = "https://api.value-domain.com/v1/domains/"
domain = os.environ.get('CERTBOT_DOMAIN')
validation = os.environ.get('CERTBOT_VALIDATION')
apikey_file = Path(__file__).parent / 'apikey.txt'
with apikey_file.open('r') as f:
api_key = f.read()
api_key = api_key.strip()
def get_dns_record(domain):
get_dns_record_url = api_endpoint + domain + "/dns"
headers = {
"Authorization": "Bearer " + api_key
}
response = requests.get(get_dns_record_url, headers=headers, timeout=60)
json_response = json.loads(response.text)
records = json_response['results']['records']
return records
def update_dns_record(domain, records):
update_dns_record_url = api_endpoint + domain + "/dns"
headers = {
"Authorization": "Bearer " + api_key,
"Content-Type": "application/json"
}
data = {
"ns_type": "valuedomain1",
"records": records,
"ttl": "3600"
}
json_data = json.dumps(data)
response = requests.put(update_dns_record_url, json_data, headers=headers, timeout=60)
def main():
print("Domain: " + domain)
print("Validation: " + validation)
cmd = "REGEST"
if len(sys.argv) > 1:
cmd = sys.argv[1]
if cmd == "REGEST":
records = get_dns_record(domain)
records = records + f"\ntxt _acme-challenge {validation}"
print(records)
update_dns_record(domain, records)
time.sleep(60)
elif cmd == "DELETE":
records = get_dns_record(domain)
records = records.replace(f"\ntxt _acme-challenge {validation}", "")
print(records)
update_dns_record(domain, records)
print("DNS AUTH DONE.")
if __name__ == "__main__":
main()
上記スクリプトは、次のスクリプトを参考に(というか、ほぼパクって)作成した。下記スクリプトはそのままだと認証できないので、手直しが必要。
GitHub - rtssn/value-domain-dns-challenge: Value Domainのネームサーバーを使ったCertbotのDNSチャレンジを行うフックスクリプトです。
Value Domainのネームサーバーを使ったCertbotのDNSチャレンジを行うフックスクリプトです。 - rtssn/value-domain-dns-challenge
/usr/local/vdapi/post-hook.py
ファイルを次の内容で作成し、ファイル権限を755にしておく。
#!/bin/sh
chown cyrus:cyrus /etc/letsencrypt/archive/*/*.pem
ファイルの所有者をcyrusにしておかないと、Cyrus IMAPdのSSL/TSL認証がエラーとなるため。
ワイルドカード認証で発行
次のオプションをつけてcertbotを実行する。
# sudo certbot certonly \
--key-type=rsa \
--manual --preferred-challenges dns-01 \
-m administrator@my.domain.jp \
-d '*.my.domain.jp' \
--cert-name wildcard.my.domain.jp \
--manual-auth-hook '/usr/local/vdapi/value-domain-hook.py' \
--manual-cleanup-hook '/usr/local/vdapi/value-domain-hook.py DELETE' \
--post-hook '/usr/local/vdapi/post-hook.sh'
一度発行してしまえば、その後は certbot renew
を実行するだけでよい。オプションは保存されているので、毎回指定する必要なし。