先日、外部から接続できない VLAN を設定した。ここにテスト環境の WordPress を設置して、LAN 内に DNS サーバーは無いからノート PC(接続元)の /etc/hosts にホスト名と IP アドレスを記述することでテスト環境に接続している。
このとき、外部から隔離されているとはいえ、https で接続したいと考えるのは自分だけじゃないだろうということで DNS-01 チャレンジを試してみた。
概要
試験環境は隔離された LAN だから外部から port80 への接続を前提とした HTTP-01 チャレンジは使えない。
でも、お世話になっている MyDNS.jp は、DNS-01 のワンタイムパスワードを TXT レコードに登録するための専用 API と、API を使った証明書取得・更新用の php スクリプトが公開されている。
どっちみち php をインストールしている環境だし活用させてもらうことにした。
手順
基本的に上の通りで問題なく証明書を取得することができるけど、ちょっとした事前準備ということで。
今回の例として、ドメイン(example.com)のサブドメイン(test.example.com)単独の証明書を取得する場合をメモしておく。
ちなみに、*(ワイルドカード)を使ったサブドメイン何でもあり(*.example.com)の証明書取得なら特段の準備はいらない。また、HTTP-01 チャレンジが使える場合も特に悩むことは無いと思う。
子 ID へのサブドメインの移譲(DELEGATE)
MyDNS.jp にログインして DOMAIN INFO を見るとサブドメインの移譲についての説明がある。これを使って、子 ID を作ってから、ホスト名「test」を子 ID に移譲する。
手順は、
- example.com の ID で MyDNS.jp にログインする。
- USER INFO から子 ID を追加する。
- DOMAIN INFO から、Hostname「test」の Type を「DELEGATE」に、Target ID を追加した子 ID に変更する。
- 一旦ログアウト。追加した子 ID で MyDNS.jp に再度ログインして、DOMAIN INFO から Domain が「test.example.com」となっていることを確認する。
- DNS-01 チャレンジの準備ができたから、追加した子 ID の情報を使って証明書を取得する。
こんな感じ。
証明書を取得するときのコマンド
ワイルドカード証明書はいらない。
更新はいつものとおり cron で certbot renew を実行する。
apache2 の設定ファイルは必要に応じて適宜修正を。
$ sudo certbot certonly --manual \
--preferred-challenges dns \
--manual-auth-hook /home/hoge/www/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /home/hoge/www/DirectEdit-master/txtdelete.php \
-d test.example.com \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m yourmailaddr \
--manual-public-ip-logging-ok
��前はわからないけど、今は /etc/letsencrypt/renewal/test.example.com.conf として証明書取得時の情報が保存されている。更新時の cerbot renew でも利用されるから特に意識する必要は無い。
/etc/cron.d/ には更新用の設定ファイル certbot もあるし至れり尽くせり。
念の為、/etc/letsencrypt/renewal-hooks/ に apache 再起動用のスクリプトを保存しておいた。
#!/bin/bash
systemctl reload apache2.service
反省
最初は、サブドメイン用のワイルドカード証明書を取得できるなら、単独のサブドメイン用の証明書も普通に取得できるだろうと勝手に解釈していた。
Proxmox VE のノードも DNS-01 チャレンジでサブドメインの証明書を取得できているから何も疑ってなかった。
TXT レコードにワンタイムパスワードを書き込むときにエラーが出てたから気がついたけど、思い込みはダメ。
コメント