Value Domain APIを使ったワイルドカード認証

Value Domain APIを使い、certbotでワイルドカード認証をするためのメモ。

環境

設定方法

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 を実行するだけでよい。オプションは保存されているので、毎回指定する必要なし。

参考

タイトルとURLをコピーしました