PHP騒動でサーバーを再構築したついでにこれまで面倒で放置していたWWWサーバーのHTTPS化をしようかと思ったら、どうやらLet’s Encryptを使うとほぼ全自動でHTTPS化に必要な証明書を無料で発行してもらえるらしい。
というわけでDebianでLet’s Encryptを利用する手順を記録しておく。ただし、この手順はWWWサーバーが発行しようとしているFQDNでHTTPで接続できる必要がある。というのも証明書を取得しようとしている相手が本当にそのサーバーの管理者であるかどうかをLet’s Encrypt側からHTTP接続して確認する作業が途中に挟まれるからである。そうじゃない場合もいろいろと方法があるみたいだが、全自動で設定というわけにはいかないので、すでにFQDNでHTTPを公開しているサーバーにおける手順として記録する。
まずはLet’s Encryptの自動設定パッケージとApacheをサーバーにしている場合にApacheの設定を自動でやってくれるスクリプトをインストールする。
sudo apt install certbot python3-certbot-apache
インストールが完了したらcertbotを実行する。オプションでこのサーバーのApacheの設定を自動でやるように指示をする。途中の過程でWWWサイトのルートに認証用のファイルを自動で置いてLet’s Encrypt側から読み出す過程があるので管理者権限で実行すること。
sudo certbot –apache
対話的に進めていくとApacheでServerNameが設定されているとそのドメインで証明書取得するかと聞かれるので取得したいドメインを選ぶ。あとはcertbotが自動で証明書の取得、適切なディレクトリへの配置とシンボリックリンクの作成、Apacheのmod_sslの有効化とVirtual Hostの設定まで済ませてくれる。以前はHTTPで接続したときにHTTPSに強制リダイレクトするかどうかを選択できたようだが、今はもう勝手に強制リダイレクトを設定されるようだ。
たったこれだけの手順でWWWサーバーのHTTPS化は完了する。実際にHTTPでアクセスすると自動的にHTTPSに変更されて有効な証明書を使った安全な接続であることがブラウザで確認できた。ルーターの静的NATでHTTPSのポート443を内部のWWWサーバーにマップすることを忘れないこと。でないと強制HTTPSリダイレクトなので外部から全くアクセスできなくなってしまう。
Let’s Encryptで発行される証明書は期限が90日(じきにもっと短くされるらしい)しかなく、期限切れまでにcertbotで更新する必要があるが、Debianのcertbotパッケージはインストール時にsystemdに期限を監視して自動で更新するタイマーを設定してくれ、更新が実行されるとApacheも自動でリロードされるようだ。一応、残り30日以下になると自動更新が実行されるみたいなので60日過ぎてからもHTTPSで問題なく接続できれば自動更新にまかせて大丈夫だろう。