近年のWebページといえば、静的ページだとしてもHTTPSが当たり前ですよね。
2014年頃から、Googleの検索ではSSL/TLS化されたサイトが優先されるようになりました。
更には、2018年7月にリリースされた、Chrome68以降では、httpサイトでは警告が表示されるようになりました。

つまり、これからはHTTPというだけで表示することすら危険ということです。
Webページを作ったら、HTTPS化しなければなりません。

今回は、ラズパイで作ったWebサーバーを、HTTPS化していきます。
そもそもHTTPSって?SSL/TLSって?というのは・・・割愛です(汗)

環境は以下の通り。
ハードウェア:Raspberry Pi 4
OS:RaspberryPi OS
Webサーバー:Apache2

どんな環境でも基本的な流れは同じなので、参考になると思います。


0.そもそもどうやってHTTPS化する?


HTTPSにするには、認証機関にサーバー証明書を発行してもらう必要があります。
それは誰がやってくれるか?という問題を解決するのが、Let's Encryptです。

Let's Encryptは、すべてのWebサイトを暗号化することを目指したプロジェクトです。
Let's Encryptでは、30日間の証明書を発行してくれます。

設定には、Certbotというツールを使用します。
Certbotは、証明書発行からWebサーバーの設定までやってくれます。
さらには、証明書の自動更新までやってくれます。

それでは、実際にやっていきます。


1.Certbot手順確認


Certbotの手順に従って作業を行うため、まずは手順を確認する。
https://certbot.eff.org/ にアクセスします。

アクセスしたら、MyHTTP website is runnning [software] on [system] の部分を、自分の環境にあったものを選択します。

softwareはApache、Systemは、RaspiOSが無いので、RaspiOsのベースとなっている、Debianの最新版(buster)を選択。
表示される手順に従って作業実施していきます。


2.Apache設定ファイル作成(https用)


HTTPS用のバーチャルホスト設定を作成しておく。
作成する際は、sites-availableディレクトリ配下のdefault-ssl.confをベースにして作成するといい。

また、apacheのSSLモジュールを以下のコマンドで有効化しておく。
a2enmod ssl


3.snapdインストール


Certbotの手順によると、まずはsnapdを使ってCertbotをセットアップしろとのことなので、そのとおりにする。
https://snapcraft.io/docs/installing-snapd
 
snapdはRaspiOS用の手順があるため、それに従ってインストールします。
なお、以下作業はすべてroot権限で実施しています。
必要に応じてsudoを付与してください。

まずはaptでsnapdをインストールし、再起動。
apt update
apt install snapd

reboot
 
再起動後、以下コマンドを実行。
snap install core
 
これでsnapdのインストールは完了のようだ。
 
正常にセットアップできているか確認していく。
 
snap install hello-world
hello-world

という手順だが、PATHが通ってないため、/snap/bin/hello-world と指定して実行する。

だが、ここでエラー。
ERROR: ld.so: object '/usr/lib/arm-linux-gnueabihf/libarmmem-${PLATFORM}.so' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.

libarmmem-${PLATFORM}.soをロードできないようだ。
rpi-updateをすると治るとの情報もあったが、rpi-updateは推奨されないようだ。
パッケージをアップデートしてみる。
 
apt update
apt full-upgrade -y
が、解消せず。

そもそも、RaspberryPiにはlibarmmem.soが存在しないようだ。
/etc/ld.so.preload に、プログラム実行前にロードするライブラリが記載されているのだが、ここにlibarmmemが記載されている。
なのでこのファイルのlibarmmemの記載をコメントアウトすることで、ロードされないようにした。
(エラーは出るが、無視しても良かったのかもしれない。)

改めて、動作確認。
hello-world


4.Certbotのインストール


すでにcertbotがインストールされている場合は、事前に削除しておく。
apt-get remove certbot

削除できたら、インストールを実施。
snap install --classic certbot

たったのこれだけだ。


インストールができたら、シンボリックリンクを作成しておこう。
ln -s /snap/bin/certbot /usr/bin/certbot


5.Apache設定


Certbotで、Webサーバーの設定をすることができます。
apacheの場合は以下のコマンドで実行できます。

certbot --apache

設定は、対話形式で行なっていきます。
指示に従って、入力していきます。

・emailアドレスを入れろと言われるため、入れる。

・規約のPDFを読む。
 https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf.
 Yで同意。

・Let'sEncrypt、Certbotの開発に関するメールを送っていいかと聞かれる。
 Nを選択。

・Which names would you like to activate HTTPS for?
 https化するホスト名を選択。

「Successfully received certificate.」と出れば、成功。

以下のように、証明書のパスと秘密鍵のパスが表示される。
Certificate is saved at: /etc/letsencrypt/live/<サーバー名>/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/<サーバー名>/privkey.pem

また、apacheのsites-available配下のSSHホスト設定ファイルに、以下の内容が追記されます。
SSLCertificateFile      /etc/letsencrypt/live/<サーバー名>/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<サーバー名>/privkey.pem

上記でApache設定ファイルが書き換えられているため、Apacheを再起動する。
systemctl restart apache2

これでHTTPSアクセスしてみると、URLの左側に、鍵マークが表示される。
鍵マークをクリックすると、以下のように証明書が有効になっていることが確認できる。

証明書が有効になっている


HTTPS化はこれで完了です。


8.自動更新のテスト

HTTPS化はできたが、証明書の有効期限は90日なので、定期的に証明書を更新していく必要があります。
更新処理が実行可能か確認するために、更新のドライランという機能があります。更新処理のテスト機能のようなものです。

ドライランは以下のコマンドで実行できます。
certbot renew --dry-run

Congratulations, all simulated renewals succeeded
と出れば、証明書の更新は問題なくできるはずです。

証明書の期限が残り30日になると、自動で更新してくれるはずです。


9.自動更新時のApache再起動

証明書を更新した際に、Apacheを再起動しないと、新しい証明書が反映されないため、更新時に再起動する仕組みを作る。

以下ディレクトリに、証明書更新時に処理を行う仕組みがあるため、それを利用する。
/etc/letsencrypt/renewal-hooks

このディレクトリ配下には、以下のディレクトリがあり、ここに証明書更新時に実行する処理のシェルを配置します。
配置するディレクトリによって、実行するタイミングが異なります。
 pre:証明書更新処理の前に実行する。
 post:証明書更新処理の後に、必ず実行する。
 deploy:証明書更新処理の後に、証明書が更新されている場合は実行する。

今回は、deploy配下に、以下のようなシェルを配置する。
#!/bin/bash
systemctl restart apache2

作成したシェルには実行権限を付けておきましょう。

以上で完成です。


やるべきことは結構ありましたが、ほとんどが自動でやってくれ、設定ファイルの追記までしてくれるため、とっても簡単です。
以前はこれらを手動で実行していたことを考えると、とてつもなく楽になっています。

これなら、すべてのWebサーバーがHTTPS化される日も遠くないかもしれませんね。