Let's EncryptクライアントをcertbotからApacheモジュール mod_md に変えてみた
参照:The Apache HTTP Server
こっちの方が楽かも?
昨年、突然Let's Encryptの証明書更新が失敗するようになったのですが、引っ越しなどもあって復旧にかなりの時間がかかってしまいました。詳しい原因は不明ですが、Let's EncryptのACMEv2への移行や、それに伴う仕様変更などが原因ではないかと思っています。
そこで、今後同じようなLet's Encryptの認証の仕組みに仕様変更があっても柔軟に対応できるよう、他のLet's Encryptクライアントも試してみることにしました。具体的にはApacheのモジュール"mod_md"へ移行させてみようと思います。
手順としては以下のようになります。
- Apacheのビルド時に"mod_md"を有効化
- 設定ファイルに"mod_md"の設定を追加。先ずはテスト用のURLでFake(偽物)の証明書が取得できるようにする。
- 本番用のURLに変更して正式な証明書を取得
- cronによるcertbotでの証明書更新を止める
また、これは自分のための備忘録なので、他のマシン環境では当てはまらない部分もあろうかと思いますのでご容赦ください。
Apacheは現時点での最新版2.4.46を使いました。これのビルド時にmod_mdを有効化します(mod_sslも必要ですが、こちらは既に実施済み)。
./configure
--prefix=/usr/local/apache2
--enable-dav
--enable-md
--enable-so
--enable-ssl
--enable-http2
--enable-mods-shared=most
--with-apr=/usr/local/apache2
--with-apr-util=/usr/local/apache2
--with-curl=/usr/local/lib
--with-ssl=/usr/local/ssl
--with-z=/usr
make
|
Apacheの設定ファイル"httpd.conf", "extra/httpd-ssl.conf"に"mod_md"の設定を追加します。このとき、もしうまくできなかったら簡単に元に戻せるよう <IfModule> を使うようにしました。
詳しい設定内容については、他に親切丁寧に解説されているサイトが一杯あるので割愛。
以下ではMDCertificateAuthorityにテスト用のURLを指定しています。先ずはこれでFake(偽物)の証明書が取得できるか試します。
[httpd.conf]
LoadModule md_module modules/mod_md.so
〜
<IfModule md_module>
MDBaseServer on
MDCertificateProtocol ACME
MDCAChallenges http-01
MDRenewMode auto
MDPrivateKeys RSA 2048
MDRenewWindow 33%
MDStoreDir md
# テスト用URL(これでFake証明書が取得できるか試す)
MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
# 本番用URL(正式な証明書を取得する際に使用)
# MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory
MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf
MDomain y-naito.ddo.jp
<VirtualHost *:80>
ServerName y-naito.ddo.jp
DocumentRoot "/usr/local/apache2/htdocs"
</VirtualHost>
</IfModule>
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
〜
|
[extra/httpd-ssl.conf]
##
## SSL Virtual Host Context
##
<VirtualHost _default_:443>
ServerName y-naito.ddo.jp
DocumentRoot "/usr/local/apache2/htdocs"
ServerAdmin mailaddr@xxxx.ne.jp
SSLEngine on
<IfModule !md_module>
# certbotで取得した証明書。mod_mdが有効の場合は不要
SSLCertificateFile "/etc/letsencrypt/live/y-naito.ddo.jp/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/y-naito.ddo.jp/privkey.pem"
</IfModule>
〜
</VirtualHost>
|
念のため設定を確認しておきます。
$ sudo /usr/local/apache2/bin/apachectl configtest
Syntax OK
|
大丈夫そうですね。この後Apacheを2回再起動します。1回目の再起動でmod_mdが有効になり、"/usr/local/apache2/md"ディレクトリが作成されます。この時点ではApacheのダミー証明書(以下)を使って起動した状態のため、
https接続すると不当なSSL証明書というエラーになります。
2回目の再起動でFake(偽物)の証明書がLet's Encryptから発行される筈なので、https接続して証明書を確認します。以下のような証明書であればOK。
Fake(偽物)の証明書が取得できていたら正しく設定できていると思われますので、本番用のURLに変更して正式な証明書を取得します。
[httpd.conf]
<IfModule md_module>
〜
# テスト用URL(これでFake証明書が取得できるか試す)
# MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
# 本番用URL(正式な証明書を取得する際に使用)
MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory
〜
</IfModule>
|
Apacheを再起動する前にFake(偽物)証明書を削除しておく必要があります。
# cd /usr/local/apache2
# rm -rf md/
|
この後、前回と同じようにApacheを2回再起動します。1回目の再起動では前回同様Apacheのダミー証明書ですが、2回目の再起動で正式な証明書になっている筈です。
以前cronで証明書を自動更新するようにした設定を削除します。
以上で移行作業は完了です。
|