【ポート開放なし】MyDNS.JPのワイルドカード証明書を簡単に取得する【Docker】


誰でも無料でSSL証明書が取得できるLet's Encryptですが、80番ポートが使える環境でない場合はDNS-01チャレンジでドメインの所有者であることを確認する方法が使えます。
前にWindowsリモートデスクトップをLet's EncryptでSSL証明書を発行して使うの記事を書きましたが、この時はacme.shを使ってDNS-01チャレンジをクリアしました。が、最近なぜかうまくいかなくなってしまったので、MyDNS.JP本家のスクリプトをお借りし、CertbotでDNS-01チャレンジをクリアしたいと思います。

前提

  • x86_64
  • Linux
  • Dockerがインストール済み

MyDNS.JP本家のスクリプトはPHPが必要ですが、なるべく環境を汚したくないのでDockerでいきます。
Certbotの公式イメージを使いますが、arm64には対応していなかったので注意。

筆者の検証環境

  • Ubuntu 20.04 (WSL2)
  • Docker 20.10.5

ソースコード

Certbot-Docker-MyDNSJP

手順

手順1, 2をすっ飛ばしたい方は上記ソースコードを使ってください。

  1. MyDNS.JP本家のスクリプトのダウンロード && 編集
  2. スクリプトの作成
  3. 証明書ゲット!

1. MyDNS.JP本家のスクリプトのダウンロード && 編集

本家の通りです。

cd /your/domain/directory/
wget 'https://github.com/disco-v8/DirectEdit/archive/master.zip' -O DirectEdit-master.zip
unzip ./DirectEdit-master.zip

お好みのエディタで ./DirectEdit-master/txtedit.conf を編集します。
$MYDNSJP_MASTERID$MYDNSJP_MASTERPWD$MYDNSJP_DOMAINの値を書き換えてください。

txtedit.conf
<?php
// ------------------------------------------------------------
//
// txtedit.conf
//
// ------------------------------------------------------------
?>
<?php
    $MYDNSJP_URL       = 'https://www.mydns.jp/directedit.html';
    $MYDNSJP_MASTERID  = 'your-masterid';
    $MYDNSJP_MASTERPWD = 'your-password';
    $MYDNSJP_DOMAIN = 'your-domain';
?>

2. スクリプトの作成

Dockerfileを下記の内容で作成します。

Dockerfile
FROM certbot/certbot

RUN apk update \
 && apk add php7 php7-fpm php7-opcache php7-openssl php7-mbstring

COPY ./DirectEdit-master/* /var/DirectEdit-master/
RUN chmod 700 /var/DirectEdit-master/*.php \
 && chmod 600 /var/DirectEdit-master/*.conf

次に、issue_cert.shを作成します。
your-domain*.your-domainyour-mail-addressの部分を書き換えます。

issue_cert.sh
#!/bin/bash

docker image build . -t certbot

docker run -it --rm --name certbot \
       -v "/etc/letsencrypt:/etc/letsencrypt" \
       -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
       certbot certonly --manual \
       --preferred-challenges=dns \
       --manual-auth-hook /var/DirectEdit-master/txtregist.php \
       --manual-cleanup-hook /var/DirectEdit-master/txtdelete.php \
       -d your-domain -d *.your-domain \
       --server https://acme-v02.api.letsencrypt.org/directory \
       --agree-tos -m your-mail-address \
       --manual-public-ip-logging-ok

3. 証明書ゲット!

先ほど作成したスクリプトに実行権限を与えて実行します。

chmod u+x issue_cert.sh
./issue_cert.sh

Congratulations!と出ていれば成功です!
Your certificate and chain have been saved at:Your key file has been saved at:に表示されているホスト側のディレクトリを見ると証明書とキーがそれぞれ入っているはずです。

最後に、更新用のスクリプトをcronに登録しておきましょう。1週間に一度実施すればよいと思います。

renew_cert.sh
#!/bin/bash

docker run -it --rm --name certbot \
       -v "/etc/letsencrypt:/etc/letsencrypt" \
       -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
       certbot renew
chmod u+x renew_cert.sh

参考文献

disco-v8 / DirectEdit
Certbot - Get Certbot - Running with Docker