Raspberry PiにSSL証明書導入(Let’s Encrypt)

2023年9月4日技術開発html,Raspberry Pi

概要

certbotのインストールの参考記事は多くあるものの、SSL証明書取得の部分の解説が少なかったので備忘録として投稿します。

実行環境

MCU:Raspberry Pi 2B+
OS:Raspberry Pi OS
Webサーバー:Apache/2.4.56 (Raspbian)

※apache2のドキュメントルートはデフォルトのままで進めています。変更した場合はユーザー権限の関係で403エラーになります。
 色々設定してしまっていてまっさらに戻したいときは、以下のコマンドで初期状態に戻ります。

sudo apt purge apache2
sudo apt install apache2

certbotのインストール

GithubからクローンしたものをインストールするとRaspberry Pi特有の問題が発生するそうなので、aptからインストールします。

sudo apt install certbot

certbotの実行

以下のコマンドでcertbotを実行します。

sudo certbot certonly

実行すると以下のメッセージが表示されます。今回は永続的にSSL認証をしたいので「2」を入力してエンターを押します。

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 

~和訳~
ACME CA でどのように認証しますか?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: 一時的な Web サーバー (スタンドアロン) を起動します。
2: ファイルをウェブルート ディレクトリ (ウェブルート) に配置します。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
適切な番号 [1-2] を選択し、[Enter] を押します (キャンセルするには「c」を押します):

次に以下のメッセージが表示されるので自分のE-mailアドレスを入力します。

Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): 

~和訳~
選択したプラグイン: ウェブルートで認証、インストーラーなし
メールアドレスを入力してください(緊急の更新やセキュリティに関する通知に使用されます)
  (キャンセルするには「c」を入力します):

利用規約の同意を求められるので「y」を入力してエンター。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: 

~和訳~
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
次のサイトで利用規約をお読みください。
https://letsencrypt.org/documents/LE-SA-v1.3- September-21-2022.pdf
ACME サーバーに登録するには、同意する必要があります。 同意しますか?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(はい・いいえ:

ニュース等をメール配信してもいいですか?と聞かれます。Noでも大丈夫です。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: 

~和訳~
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
最初の証明書が正常に発行されたら、Let's Encrypt プロジェクトの創設パートナーであり、
Certbot を開発する非営利団体である Electronic Frontier Foundation と電子メール アドレスを共有してもよろしいでしょうか?
Web の暗号化に関する取り組み、EFF ニュース、キャンペーン、デジタルの自由をサポートする方法について電子メールをお送りしたいと考えています。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(はい・いいえ:

ドメイン名を求められるので、SSL認証したいドメインを入力してエンター。

Please enter in your domain name(s) (comma and/or space separated)
(Enter 'c' to cancel): 

~和訳~
ドメイン名を入力してください (カンマまたはスペースで区切ります)
(キャンセルするには「c」と入力します):

ドキュメントルートの入力を求められるので、index.html等が置いてあるフォルダのパスを入力します。デフォルトから変えていなければ/var/www/html/です。

Performing the following challenges:
http-01 challenge for example.com
Input the webroot for example.com: (Enter 'c' to cancel): /var/www/html/

~和訳~
次のチャレンジを実行します。
example.comのhttp-01チャレンジ

example.comのウェブルートを入力してください。(キャンセルするには「c」と入力します):

以下のメッセージが表示されれば認証完了です。証明書とチェーン、キーファイルの保存場所は後で使うのでメモ帳等にコピーしておいてください。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your certificate will expire on 2023-10-15. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le


検証を待っています...
課題のクリーンアップ。

重要な注意事項:
おめでとう! 証明書とチェーンは次の場所に保存されています。
/etc/letsencrypt/live/example.com/fullchain.pem
キー ファイルは次の場所に保存されています。
/etc/letsencrypt/live/example.com/privkey.pem
証明書の有効期限は 2023 年 10 月 15 日に切れます。 
今後、この証明書の新しいバージョンまたは調整されたバージョンを取得するには、certbot を再度実行するだけです。 
証明書の *すべて* を非対話的に更新するには、「certbot renew」を実行します。
Certbot が気に入った場合は、次の方法で私たちの取り組みをサポートすることを検討してください。

    ISRG / Let's Encrypt への寄付: https://letsencrypt.org/donate
    EFFへの寄付: https://eff.org/donate-le

SSLの有効化

SSLの認証が出来たのでサーバーに適用していきます。
以下のコマンドを実行します。($がついているのがコマンドです)

& sudo a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2
$ sudo a2ensite default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2

次に以下のコマンドで設定ファイルをバックアップした上で開きます。

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.org
sudo nano /etc/apache2/sites-available/default-ssl.conf 

以下の3点を変更します。
SSLEngine onはもとからこの記述になっていましたが念のため。
証明書とチェーン、キーファイルのパスはメモしておいたものを使用します。
※Ctrl+Sで保存、Ctrl+Xで終了

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on
#SSLCertificateFile     /etc/ssl/certs/ssl-cert-snakeoil.pem
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateFile      /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/example.com/privkey.pem
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

設定ファイルが変更出来たらapache2を再起動します。
再起動後、「https://」でアクセス出来れば成功です。

SSL証明書の自動更新

今回取得した証明書の有効期限は90日なので、定期的に更新する必要があります。
以下のコマンドを実行すると設定はそのままで更新することが出来ます。(このコマンドは有効期限が1か月未満のときのみ更新を行うようで、今回は「更新の必要なし」とメッセージが出ています)

$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificates are not due for renewal yet:
  /etc/letsencrypt/live/example.com/fullchain.pem expires on 2023-10-15 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

このコマンドをcrontabで定期実行させます。以下のコマンドでcrontabの変種画面を開きます。

sudo crontab -e

以下の文を末尾に追記します。毎月1日の朝5時に更新する設定となります。
実行ログは/var/log/certbot.logに保存されます。

0 5 1 * 7 certbot renew >> /var/log/certbot.log 2>&1