常時HTTPS化がすすみ、多くのサイトが常時HTTPS(SSL)になってきています。
Let’s Encryptを使用してHTTPS化を実現しているところも多くありますが、そこで問題になるのがロードバランサ(LB)配下に複数のWebサーバーがある場合の証明書更新です。
Let’s Encryptは、90日ごとの更新が必要で、LB配下に複数のWebサーバーがある場合には、この更新作業が繁雑になりがちです。
今回は、このLB配下のWebサーバーで安全に簡単にLet’s Encrypt証明書の更新を行うための方法をご紹介いたします。
想定している環境
- FQDN: www.example (LBによりwww01とwww02,www03にバランシング)
- Webサーバー1: www01(192.168.1.101) / マスター
- Webサーバー2: www02(192.168.1.102) / スレーブ1
- Webサーバー3: www03(192.168.1.103) / スレーブ2
環境としては、次のような設定を事前に設定しておきます。
- Apache httpdをWebサーバーとして使用することを想定
- http通信とhttps通信はVirtualHostでホスティング
VirtualHost 192.168.1.10X (LBのヘルスチェックにも利用)
VirtualHost www.example - 各サーバーのrootで、RSA認証によりパスフレーズなしでsshアクセスできるように設定
RSA認証の設定ならびにhosts.allow などの設定の説明は割愛
発生する問題
上記のような環境の場合、マスターで Let’s Encryptの証明書更新(certbot renew)をしても、Let’s Encryptのディレクトリ確認で www02またはwww03にアクセスが言ってしまうと確認が失敗してしまいます。
何回もアクセスすると更新がロックされることもありますので、非常に危険です。
解決する方法
この問題を解決するには、以下の処理を実現する必要があります。
- LB配下で .well-known のアクセスをwww01(マスター)に集中させる
- www01の証明書を www02,www03 に同期する
- www01,www02,www03のApache httpdを再起動して証明書を有効にする
LB配下の .wel-known をwww01(マスター)に集める
www02,www3の .well-knownにアクセスがあった場合に、www01にアクセスを集めるには mod-rewrite のローカルプロキシーを使用します。
# /etc/httpd/conf.d/rewrite.conf <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_HOST} ^www.example RewriteRule ^/.well-known/(.*) http://192.168.1.101/.well-known/$1 [L,P] ProxyPassReverse /.well-known http://192.168.1.101/.well-known </IfModule>
RewriteCondにより、対象となるドメインを特定しています。
その後の RewriteRule で /.well-known/以下へのアクセスは、www01(192.168.1.101)のIPアドレスのVirtualHostにリクエストを転送しています。
これにより www01で発行した certbot renew の確認が ww02,www03 にアクセスされても、www01の内容を応答することができるようになります。
更新した証明書の同期
更新した証明書は、rsyncによりwww02,www03に同期します。
同期対象は /etc/letsencrypt/ 以下を対象とします。
同期は www01 で実行します。
rsync -av -e ssh /etc/letsencrypt/ www02:/etc/letsencrypt rsync -av -e ssh /etc/letsencrypt/ www03:/etc/letsencrypt
○証明者の有効化
更新した証明書の配置が完了したら、以下のようなコマンドを www01 で実行し証明書を有効にします。
systemctl restart httpd.service ssh www02 ‘systemctl restart httpd.service’ ssh www03 ‘systemctl restart httpd.service’
これにより、ロードバランサー配下の複数のWebサーバーのLet’s Encrypt証明者を安全に更新することができます。
これらのコマンドは、bashなどのシェルスクリプトにして cronなどで毎月実行することで更新漏れもなく安全に運用することができるようになります。
Let’s EncryptをLB配下での自動更新処理について、設置代行も行っております。