Let’s Encrypt でセキュアなサイトを作ろう

今どき非セキュアのサイトもまずいですので、フリーの Let’s Encrypt を導入してHTTPSの設定も行っておきます。

Let’s Encryptについてはこちらの本家サイトを参考に。

リリース当時はなかった、ワイルドカード証明書にも今は対応しているんですね。
実在証明なども無く、ルート証明書の期限問題も残ったりしているみたいですが、個人の趣味サイトには十分です(笑)ありがたや。

昔は、導入にも一手間かかっていたのですが、今では、面倒な取得から設定、更新やらをApacheと連携し自動で行ってくれる。。まじ涙目。超便利。

ドキュメントを読んでいる限り、Apacheの設定ファイルからドメインを絞り込んで取得といった流れっぽいのですが、ワイルドカード証明書の場合、どうやって動くのだろうと疑問も持ちつつ……

はい、インストール。

sudo apt install certbot python3-certbot-apache

インストール完了。
Apache周りはすでに稼働しているので、早速、次に。

certbotを実行。

sudo certbot --apache
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

更新通知などを受けるメアドを入力

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

もちろん同意

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing 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: N

ニュースはいらないです。

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: monmon.jp
2: www.monmon.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 

Apacheの設定ファイルからドメイン情報をもってきたんですね。
エンターだけで一応、両方取得っす。

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

非セキュアへのアクセスをセキュア環境にリダイレクトするか。
おぉ便利。

私の環境だともちろん2。

これで設定が完了します。

取得された証明書は以下に配置されました。

/etc/letsencrypt/live/monmon.jp

この時点で以下に、Apache2のssl用設定ファイルも自動生成されいるスグレモノ。

/etc/apache2/sites-available/monmon.jp-le-ssl.conf

すでにサイトもセキュアで稼働していた(笑)

https://monmon.jp/

webroot認証をApacheを使って、自動で行っているんだろうなぁ。

証明書の自動更新は

sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Fri 2021-02-26 19:04:53 JST; 10min ago
    Trigger: Sat 2021-02-27 06:52:02 JST; 11h left
   Triggers: ● certbot.service

Feb 26 19:04:53 ip-172-31-1-26 systemd[1]: Started Run certbot twice daily.

すでに稼働中(笑)

sudo certbot renew --dry-run

手動更新も問題なーし。

すごいですね。
でもでもでも、ここで取った証明書はワイルドカード証明書ではないのです。

そっちは、手動で試してみるかぁ。

ワイルドカード証明書をとってみる。

取得にはDNSにTXTレコードの追加が必要になる点だけ注意です。

sudo certbot certonly \
 --manual \
 --preferred-challenges dns-01 \
 --server https://acme-v02.api.letsencrypt.org/directory \
 --agree-tos  \
 --manual-public-ip-logging-ok \
 -d monmon.jp \
 -d *.monmon.jp \
 -m 有効なメールアドレス

*でワイルドカード指定ですね。

こんなコマンドを叩くと、次のレコードをDNSに登録してね。と案内がでるので。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.monmon.jp with the following value:

RiIvb************************************************utOM

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

DNSを変更後。エンターします。

Press Enter to Continue
Waiting for verification...
Challenge failed for domain monmon.jp
dns-01 challenge for monmon.jp
Cleaning up challenges
Some challenges have failed.

はい、エラー。

DNSの変更が反映される前に実行しちゃうとこうなります。

再トライでは念の為、DNS変更後に別のターミナルウィンドウから、DNS反映状態をチェックしました。

nslookup -q=txt _acme-challenge.monmon.jp

無事に変更内容が反映されているのを確認してから進めると。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/monmon.jp-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/monmon.jp-0001/privkey.pem

無事、いけました。

/etc/letsencrypt/live/monmon.jp-0001

0001が末尾についたディレクトリに、ワイルドカード証明書が作られてました。

ワイルドカード証明書も自動更新を

sudo certbot renew --dry-run

サクッとできるのかなぁと思いきや。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
Attempting to renew cert (monmon.jp-0001) from /etc/letsencrypt/renewal/monmon.jp-0001.conf produced an unexpected error: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.'). Skipping.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

あらら、エラー。
どうやら、手動で入れた証明書は自動更新ができず、毎回DNSを使ってチェックを行う必要があるっぽいですね。

AWSのroute53や自前のDNSなどなら自動化も可能っぽいのですが、今回はお名前ドットコムなんです……

結論、ワイルドカード無しに生きていきます。

sudo certbot delete

削除コマンドを使って、さようなら、ワイルドカード証明書。
取得から削除まで、一連の流れを実証できました(笑)

ひとまずはこんな感じで、LAMP環境の基本的な構築は完了です。

次は、メールサーバもついでに立てていきます。