近年の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
どんな環境でも基本的な流れは同じなので、参考になると思います。
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の記載をコメントアウトすることで、ロードされないようにした。
(エラーは出るが、無視しても良かったのかもしれない。)
改めて、動作確認。
そもそも、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化される日も遠くないかもしれませんね。