MyDNSのサブドメインとかLet's Encryptのワイルドカード証明書とか

 まるこめさんがRaspberry Pi 3 BのRaspbian(Raspberry Pi向けのDebian)で動かしてるWebサーバのドメインはMyDNS.JPで取得したものなんだけど、別のドメインを追加で取得して使いたいってんで、MyDNS.JPでサブドメインを取得する方法を確認してみた。

  1. WebブラウザでMyDNS.JP公式サイトの「https://www.mydns.jp」を開く
  2. 左上の「User Login」から「MasterID」と「Password」を入力して「LOG IN」を押す
  3. 左上の「Welcome Administrator」から「DOMAIN INFO」を押す
  4. 右側の「DOMAIN INFO」の末尾近くにある「Hostname*, Type*, Content,…」の下にサブドメイン名を入力して「CHECK」を押す
  5. 右側の「DOMAIN INFO」に「以下の内容でよろしければ…」が表示されるので「OK」を押す
  6. 右側の「DOMAIN INFO」に「ドメイン情報を変更しました。」が表示されることを確認する
  7. 左上の「Welcome Administrator」から「LOG OUT」を押す

 これでサブドメインでもWebサーバにアクセスできるようになったが、当然のようにサブドメインでは別のページを見せたいってことで、WebサーバのApacheのサイト設定ファイルを変更する手順を確認してみた。
 サイト設定ファイルは/etc/apache2/sites-available/000-default.confで、<VirtualHost…>から</VirtualHost>までにサイトの設定があるが、今回はドメインごとにサイトの設定を作るのでServerName ドメイン名をServerAdminの上あたりに追加する。今回の例ではドメイン名をexample.mydns.jpにしているので適宜変更する。

sudo sed -i -e '/^[ \t]*ServerAdmin[ \t]/{h;G;s/ServerAdmin.*\n/ServerName example.mydns.jp\n/}' /etc/apache2/sites-available/000-default.conf

 あとは1つ目のドメインの<VirtualHost…>から</VirtualHost>と同じ内容を直下に追加して、ServerNameのドメイン名を2つ目のドメイン名(サブドメイン)に変更し、サーバーのルートディレクトリとなるDocumentRootを/var/www/htmlから変更する。今回の例ではドメイン名をexample.mydns.jp、サブドメインドメイン名をhoge.example.mydns.jp、サブドメインのルートディレクトリを/var/www/hogeにしているので適宜変更する。

sudo sed -i -e '/^[ \t]*<VirtualHost /,/^[ \t]*<\/VirtualHost>/H;/^[ \t]*<\/VirtualHost>/{G;s/example\.mydns\.jp/hoge.example.mydns.jp/;s/\/var\/www\/html/\/var\/www\/hoge/}' /etc/apache2/sites-available/000-default.conf

 当然ながらサブドメインのサーバーのルートディレクトリは予め作っておく必要があるのと、設定ファイル変更後はApacheで設定ファイル再読み込みを行う必要がある。

sudo mkdir /var/www/hoge
sudo systemctl reload apache2

 ちなみにWebサーバがSSLにも対応している場合は、上記と同様の書き換えを/etc/apache2/sites-available/default-ssl.confに対しても行う必要がある。
 ただ、今回はWebサーバのSSLで使っているLet's Encryptで取得した証明書がワイルドカード対応ではなかったので、サブドメインの証明書が無い状態になってしまったので、Let's Encryptでワイルドカード証明書を取得し直してみた。
 ワイルドカード証明書の取得はDNS認証を使うので一時的にDNSサーバの設定を書き換える必要があるが、MyDNS.JPの場合はGitHubでツールを公開してくれているので、これを使って行うことにした。
 予め、git、php-mbstringのパッケージが必要になるのでインストールしておく。

sudo apt-get install -y git
sudo apt-get install -y php-mbstring

 ツールは取得する際にだけ使うので、どこに置いてもいいけれど今回は/var/wwwにletsencryptディレクトリを作って置くことにした。git cloneで取得(ダウンロード)したらDirectEditディレクトリにあるphpファイルのパーミッションを700に変更する。

sudo mkdir /var/www/letsencrypt
sudo git clone https://github.com/disco-v8/DirectEdit.git /var/www/letsencrypt/DirectEdit
sudo chmod 700 /var/www/letsencrypt/DirectEdit/*.php

 続いてconfファイルのパーミッションを600に変更し、サイトの説明に従ってtxtedit.confにMyDNS.JPのMasterIDとPasswordとドメイン名を記入する。今回の例ではMasterIDがmydns012345、PasswordがaBCdeFGhiJK、ドメイン名がexample.mydns.jpになっているので適宜変更する。

sudo chmod 600 /var/www/letsencrypt/DirectEdit/*.conf
sudo sed -i -e 's/yourmasterid/mydns012345/;s/yourpasswd/aBCdeFGhiJK/;s/yourdomain/example.mydns.jp/' /var/www/letsencrypt/DirectEdit/txtedit.conf

 あとはcertbotで証明書の自動更新を行うcronジョブ(/etc/cron.d/certbot等)を予め削除するか移動させた上で、/etc/letsencryptディレクトリを削除しておくか、適当にリネームしておいてから、certbotで新規にワイルドカード証明書を取得する。今回の例ではメールアドレスがhoge@example.comになっているので適宜変更する。

sudo /usr/local/bin/certbot-auto certonly --manual --preferred-challenges dns-01 --manual-auth-hook /var/www/letsencrypt/DirectEdit/txtregist.php --manual-cleanup-hook /var/www/letsencrypt/DirectEdit/txtdelete.php --server https://acme-v02.api.letsencrypt.org/directory -d example.mydns.jp -d *.example.mydns.jp -m hoge@example.com -n --agree-tos --manual-public-ip-logging-ok

 自前でDNSサーバを立てている場合は、MyDNS.JPのツールに相当する部分のスクリプトCertbotによるワイルドカード証明書と自動更新の設定で例として示されている。
 証明書が取得できたら、証明書の更新が上手く動作するかを強制更新の--force-renewalオプションと実際には証明書ファイルを書き換えない単なるテストを行うための--dry-runオプションを付けて実行する。

sudo /usr/local/bin/certbot-auto renew --force-renewal --dry-run

 最後に証明書を自動更新するcronジョブを元に戻して出来上がり。今回は毎日0時と12時に自動更新を行い、更新された場合はWebサーバのapache2と、メールサーバのdovecotpostfixの設定ファイルを再読み込みするオプションを付加している。

echo '0 0,12 * * *  root  /usr/local/bin/certbot-auto renew --post-hook "systemctl reload apache2;systemctl reload dovecot;systemctl reload postfix"' | sudo tee /etc/cron.d/certbot

 定時後、第二神明で帰宅。晩御飯はかしわの甘辛煮とポタージュスープ。
 自室に戻ったところで、めっちゃ眠かったのでこたつソファで寝てしまう。夜遅く母親に叩き起こされて風呂に入る。その後、再度就寝。