Termux環境で動作するLet’s Encryptのワイルドカードドメインに対応した自動化ツールを探せ!

termuxで動作するのがほしい!

先日、termux上で動作を試したちっさな acme-tiny というPython製のACMEクライアントですがどうやら調べたらワイルドカードには対応していないようです。ACMEとは、Automatic Certificate Management Environment の略で、ざっくり言えばSSL証明書発行の管理をやりとりするプロトコルです。rfc8555 にあるようです。この中でワイルドカード証明書はDNSチャレンジによる認証が必要ということです。

acmy-tinyの設計方針

acmy-tiny のプログラムは全部で198行です。作者は小さなプログラムにとどめておきたいようです。以下のように、200行くらいにとどめておきたいので、DNSチャレンジのサポート(ワイルドカードサポート)はしませんということです。

I don’t plan on adding DNS challenge support (thus no wildcard support)

https://github.com/diafygi/acme-tiny/issues/195#issuecomment-372097617

I don’t plan on increasing the line limit above 200.

https://github.com/diafygi/acme-tiny/issues/195#issuecomment-372097580

作者の方針なんで、仕方ないですね。でも、必要以上の機能は追加しないと言い切るのは立派なことです。当初のコンセプトは崩さず。きっと200行以内の小さなプログラムであることがどこかで生きてくるはずです。

 で、通常はこれで十分事足ります。このブログでも hack.gpl.jpというドメインの証明書が取れればいいので問題ありませんが、*.gpl.jp にも使えるようにしてみたいので、一度触れておきたいんですよね。昔は、ワイルドカードドメインの証明書って結構高くて手が出なかったのを覚えています。

ワイルドカードの証明書がほしい!

 使いたい理由として、ワイルドカードの証明書を入れておくと、移行がスムーズになるというのもあります。実は、サブドメインを hack.gpl.jp にしようかなと思っていますので、hack.gpl.jp もマッピングしておこうかなと。つまり、今作っているスマホ新サーバでは、hack.gpl.jp として運用しておいて、wordpress の設定で複数のドメインにもマッピングできるようにしておけば、DNSの切替でどっちも同じところにアクセスできるようになります。(たぶん)

https://hack.gpl.jp/
https://hack.gpl.jp/

そういう運用や移行はやったことないんですが、理論上はできそうです。これを実現するためには、ワイルドカードの証明書があると便利かなと。使わないならば、バーチャルホストの設定を2つ作り、シングルの証明書を2つ発行するという方法でもいいのですが。いやいや、せっかくワイルドカードのSSL証明書が無料で発行できるならばチャレンジするしかないでしょう!w

acme-nginx ワイルドカード証明書対応の小さなやつ!

 さて、なんか良いのは無さそうかなと、世界は広いので誰か絶対作ってるはずです。・・・はい! ありました。acme-nginx です。まだ未確認ですが termuxでも動作するはずです。

ReadMeを読んでみると、どうやらDNSのテキストレコードも自動的に書き換えるようで、これはAPIが完備したDNSプロバイダーじゃないとダメなようです。現在、動作するのは、デジタルオーシャンと、AWS Route53のDNSです。

バリュードメインのAPI

acme-nginxが、デジタルオーシャンのDNSと、AWS Toute53に対応しているのはわかりましたが、現在使っているのはバリュードメインです。ここもつい最近、APIが完備されたので、使えないか調査してみることにしました。もし使える感じなら、acme-nginx に機能を拡張すればいいだけです。

バリュードメインのAPIマニュアルはここにあります。

バリュードメインAPIドキュメント (1.0.0)

https://www.value-domain.com/api/doc/domain/

実際に、APIトークンを発行していじってみました。curlに、jq をパイプしてjsonデータを見やすくしています。jqは、termuxにもあるし、macの brewにもあります。jq、便利ですね。Qitaで知りました!

curl -H 'Authorization: Bearer ★トークン' \
-H 'Content-Type:application/json' \
-X GET \
'https://api.value-domain.com/v1/freedns/{★domainid or domianname}' | jq

トークンや、ドメインID or ドメイン名など入れると以下のように出てきます。

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1388    0  1388    0     0   2258      0 --:--:-- --:--:-- --:--:--  2260
{
  "results": {
    "domainid": "xxxxxx",
    "domainname": "gpl.jp",
    "records": "#InterLink\na www 116.58.181.140\n# gpl.jp\na @ 116.58.181.140\na hack 116.58.181.140\na jh 116.58.181.140〜省略〜\na * 116.58.181.140",
    "ttl": "60"
  },
  "request_id": "20200911xxxxxxxxxxxxxxxxxxV",
  "request": {
    "path": "/v1/freedns/xxxxxxxx",
    "method": "GET",
    "params": []
  }
}

で、このrecordsっていう値、バリュードメイン使ったことがある人ならわかると思いますが、管理画面で設定するテキストの一覧がずらっと出てきます。バリュードメインAPIドキュメントの「DNS設定の変更」の部分を読んでみると、レコードごとに改行区切りの文字列です。

はい! つまり、aレコード単体で追加や削除とか、txtレコードだけ追加とかそういうことはできません。もしそれらを実装するとなると、recordsの値をパースしてチェックして書き換えるという面倒な作業が必要です。技術的には不可能ではないのですが、そこまで作るつもりはありません。

まぁ、その荒さ(テキスト一覧の設定ファイル)がバリュードメインの良いところでもあるのですが。設定ファイルをテキストファイルで管理しているだけなので、コンパネからがっつり一括登録・編集するのが便利なんですよね。

ということで、寝ました! このテキストファイルを処理する部分まで作るとメンドくさいので、デジタルオーシャンのAPIはどうなっているのか気力が復活した時にでも調べることにします。

デジタルオーシャンのAPI

さて、日が暮れて夜があけました。ぼちぼち、デジタルオーシャンのAPIでも調べることにします。ということで、以下がドキュメントです。

Create a New Domain Record

LINK

なるほど、良くできていますね。個別にレコードタイプ(A、MX、CNAMEなど)を指定し、データを更新も可能です。これなら、DNSを変更したほうが速いですね!

バリュードメインから、デジタルオーシャンへDNSを変更

というわけで、ちょっと調べたところデジタルオーシャンのDNSだけ使うなら無料なので、ネームサーバの向け先を変更しました。デジタルオーシャンの管理パネル、なかなか使いやすかったです。

設定を行い、google のG Suite Toolbox で引くとNSが切り替わっていました。

https://toolbox.googleapps.com/apps/dig/#NS/

;QUESTION
gpl.jp. IN NS
;ANSWER
gpl.jp. 1799 IN NS ns2.digitalocean.com.
gpl.jp. 1799 IN NS ns3.digitalocean.com.
gpl.jp. 1799 IN NS ns1.digitalocean.com.

ようこそ、デジタルオーシャンへ

名前が直接的でいいですね! デジタルの海です。ここはレジストラ業務はやっていないので、ドメイン取得はできないです。しかし、どこで取得したドメインでもネームサーバの向け先をデジタルオーシャンにすれば使えます。更新料金は、自分の場合はバリュードメインに支払います。デジタルオーシャンはAPIも充実していて、使いやすそうです。仮想サーバは日本にリージョンがまだないと思うので、安くて使いやすければそのうち、使ってみるかもしれません。

※追記 半年ほど経過しましたが、平均レスポンスタイムは94msでした。自分の場合は許容範囲です。ここで実際のレスポンスタイムを見れます。(DNSのグラフ)

DigitalOceanのDNS周りでは、以下の制約がありますのでご注意を。自動翻訳なんでちょっと変ですが。

DigitalOceanは現在ドメイン登録サービスを提供していません。DigitalOcean DNSを使用するには、ドメイン名をレジストラに登録し、DigitalOceanのネームサーバーを指すようにドメインのNSレコードを更新する必要があります

デフォルトでは、最大50のドメインを追加できます。サポートチケット開いて、増加が必要な理由を説明することで、制限を引き上げることができます。

すべてのDNSレコードには、30秒以上のTTL値が必要です。
DigitalOcean DNSは、以下のCAAレコード機能をサポートしていません。

値にセミコロン(;)を送信して、証明書の発行を禁止します。
CA名の後に名前と値のタグを許可します。例:letsencrypt.org; abc=cde

ワイルドカードレコードでカバーされるホスト名で作成されたレコードは、そのホスト名のワイルドカード解決を停止します。たとえば、にAワイルドカードレコードがあり*.example.com、ホスト名にMXレコードを追加するemail.example.comと、Aワイルドカードレコードはで提供されなくなりますemail.example.com。ただし、email.example.comユースケースで必要な場合は、ホスト名に明示的なAレコードを追加できます。

DigitalOcean DNSはタグをサポートしていません。

DigitalOceanの利用規約では、OFAC認定国からの国コードトップレベルドメイン(ccTLD)を追加することは禁止されています。国のリストなどの詳細については、参照ネットワークの合法的な使用にセクションを利用規約

https://www.digitalocean.com/docs/networking/dns/

さて、では記事が長くなりすぎるので、acme-nginx でワイルドカードドメイン証明書を取得するお楽しみは、別記事にします。では、また〜!

Termux環境で動作するLet’s Encryptのワイルドカードドメインに対応した自動化ツールを探せ!」への2件のフィードバック

  1. ピンバック: Termuxネイティブ環境でacme-nginxを使いワイルドカード証明書を自動取得! – アリエクでポチった JunkHack

  2. ピンバック: WordPressのコマンドラインツール、wp-cliを使ってみたら便利だった! – アリエクでポチった JunkHack

コメントは受け付けていません。