2020年1月17日金曜日

FreeBSDでLet'sEncryptをMyDNSのDNS認証で自動更新させる

超下書き記事。後で清書予定。
ほとんどLet’s Encrypt + MyDNS でワイルドカードSSL証明書を自動更新する方法のコピー記事ですが(ごめんなさい)、自分の環境(FreeBSD12.1)に合わせて一部補足しています。
この方法であれば、80番や443のポート開放しなくてもLet'sEncryptの更新ができる。
V6プラスで任意のポートが使えない場合に有効だと思われる。

まず、MyDNSがリリースしたDNS認証の公式スクリプトはPHPで書かれているため、それが動くように下記の3つをインストールする。
# pkg search php
php74-7.4.1                    PHP Scripting Language
php74-openssl-7.4.1            The openssl shared extension for php
php74-mbstring-7.4.1           The mbstring shared extension for php

# pkg install php74-7.4.1
# pkg install php74-openssl-7.4.1
# pkg install php74-mbstring-7.4.1

ターミナルを開き、次のコマンドをroot権限で実行します
# cd ~ #ホームフォルダなどの作業スペースへ移動
# wget 'https://github.com/disco-v8/DirectEdit/archive/master.zip' -O DirectEdit-master.zip #MyDNSの自動更新スクリプトをダウンロード
# unzip master.zip #ダウンロードしたZipを解凍
# mv DirectEdit-master /opt/ #解凍したフォルダを/opt/に移動

次に、自動DNS書き換えの設定をしていきます。
# vi /opt/DirectEdit-master/txtedit.conf

内容を下記のように書き換えます。
$MYDNSJP_URL       = 'https://www.mydns.jp/directedit.html'; //そのまま
$MYDNSJP_MASTERID  = 'mydnsXXXXXX'; //MyDNSユーザーID
$MYDNSJP_MASTERPWD = 'yourmydnspasswd'; //MyDNSパスワード
$MYDNSJP_DOMAIN = 'example.com'; //MyDNSに登録したドメイン名

PHPのパスを確認
# which php
/usr/local/bin/php
FreeBSD12.1のphp7.4はここにbinのパスがあるため、
/DirectEdit-master/内のtxtregist.phpとtxtdelete.phpのbin/phpのパスを設定する。(1行目)
# vi /opt/DirectEdit-master/txtregist.php
#!/usr/local/bin/php
(txtdelete.phpも同様に行う)

権限を変更します。
# cd /opt/DirectEdit-master
# chown root:root ./
# chmod 700 ./*.php //DNS自動更新プログラム
# chmod 600 ./*.conf //設定ファイル

これで下準備はOKです。
既にLetsEncryptの証明書ファイルが有る場合はエラーの原因となるため、リネームして排除しておく。
# mv /usr/local/etc/letsencrypt /usr/local/etc/old_letsencrypt


それではMyDNS自動更新スクリプトを使ってdns-01認証でワイルドカード証明書を取得してみます。
# certbot-auto certonly --manual \ #certbot-autoコマンドは環境によって名前が異なる場合があります。
--preferred-challenges=dns \
--manual-auth-hook /opt/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /opt/DirectEdit-master/txtdelete.php \
-d example.com -d *.example.com \ #※左記以外のサブドメイン(たとえばa.example.com)はMyDNSのスクリプトではエラーになるため指定できません。サブドメインのSSLを取得する場合は別途従来のhttp-01認証で取得してください。
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m hoge@example.com \ #Let'sEncryptからの通知を受け取るアドレスを指定します。
--manual-public-ip-logging-ok

更新ができるか確認
# certbot renew --dry-run

成功したらCrontabに登録
# crontab -u root -e
00 04 01 * * certbot renew
自動でApacheのリロードも行う。
01 04 01 * * /usr/local/etc/rc.d/apache24 reload

参考
Let’s Encrypt + MyDNS でワイルドカードSSL証明書を自動更新する方法
Let’s Encrypt の証明書の更新を自動化する手順 (cron)

1 件のコメント:

  1. このコメントはブログの管理者によって削除されました。

    返信削除