Let’s EncryptでSSL化
概要
前回記事「CentOS8にWordPressを導入する」でWordpressを導入したWebサイトとしてこのVPSを運用できるようになりましたが、HTTPアクセスだと通信経路が暗号化されていないため、第3者にwordpressのユーザー名やパスワードを盗み見られる可能性があります。無料のSSL証明書発行サービスであるLet’s Encryptを導入し、WebサイトをSSL化します。今は常時SSL化が望ましいとされ、SEOの観点からも必ず導入しておいた方がいいですね。
やること
- mod_sslをインストールする
- ポートを開放する
- Let’s Encryptをインストールする
mod_sslをインストールする
ApacheでSSLを使えるようにするために「mod_ssl」というモジュールをインストールします。
dnf install mod_ssl
インストールできたらApacheを再起動します。
systemctl restart httpd
これでApacheでSSLを使用可能になりました。
ポートを開放する
HTTPS通信に使われるポートを開放します。HTTPS通信に使われるポート番号は443番です。
ポート番号を直接指定するか、サービス名を指定し通信を許可します。
firewall-cmd –add-service=https –zone=public –permanent
systemctl restart firewalld
以上でHTTPSでアクセスできるようになりましたが、まだ証明書がないのでこの段階でHTTPSでアクセスすると「安全な接続ではありません」という警告メッセージがブラウザ上に表示されます。
Let’s Encrypt をインストールする
certbotをインストールする
Let’s Encrypt を利用するためのクライアント「certbot」をインストールします。
dnf –enablerepo=epel install certbot python3-certbot-apache
ポート80の仮想ホストを追加
certbotを導入したので早速Let’s Encryptをインストールしようとしたら、下記のエラーメッセージが出ました。
Unable to find a virtual host listening on port 80 which is currently needed for Certbot to prove to the CA that you control your domain. Please add a virtual host for port 80.
certbotに必要なポート番号80の仮想ホストが存在しませんと言われてしまったので、このエラーを解決するために仮想ホストを追加します。
「httpd.conf」をテキストエディタで編集し、エラーを解決します。
私は「nano」というテキストエディタを使用しています。
cd /etc/httpd/conf
nano httpd.conf
テキストエディタで「httpd.conf」を開いたらファイルの最後に以下を記述します。例としてドメイン名をsample.comにしています。
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin root@sample.com
DocumentRoot /var/www/html
ServerName sample.com
</VirtualHost>
以上でエラーを解決できるので、いよいよLet’s Encryptをインストールします。
証明書を取得します。
certbotコマンドを実行して証明書を取得します。
例としてsample.comにしています。
certbot –apache -d sample.com
実行するとE-Mailアドレスの入力や規約の同意などいくつか質問されますので順番に答えていきます。全て終え、無事にインストールできたら下記のメッセージが表示されます。
Congratulations! You have successfully enabled https://example.com
最後にhttpdをリスタートします。
systemctl restart httpd
Let’s Encryptのインストールを終えたので、SSLが使えるようになりました。HTTPSで自身のwebサイトにアクセスするとSSL化されているのでアドレスバーの横に鍵マークが表示されていると思います。
SSL証明書の更新
SSL証明書の有効期限は90日です。期限切れになる前に必ず更新しておきましょう。更新はcertbotコマンドで行います。
SSL証明書の更新は期限が30日未満の場合のみ実行されます。
有効期限に関わらずすぐに実行したい場合は「–force-renew」オプションで実行します。
certbot renew
certbot renew –force-renew
証明書更新の自動化
有効期限を把握して、忘れないように更新作業をする!っていうのは面倒ですね。利用者の設定したスケジュールに従って指定されたプログラムを定期的に起動してくれる「cron」を使って更新作業を自動化しましょう。証明書の更新にはroot権限が必要なので、rootユーザーのcronに設定します。
crontab -e
実行するとテキストエディタが起動するので、下記のように記述します。
00 03 01 * * certbot renew && systemctl restart httpd
毎月1日3時00分に実行するようにスケジュールしました。証明書の有効期限が30日以上ある場合は更新されず、30日未満の時に自動更新されます。
また、SSL証明書が更新された後にWebサーバーを再起動するようにスケジュールしておきます。
cronのスケジュールは左から順に、[分][時][日][月][曜日]と指定します。
分・・・0~59
時・・・0~23
日・・・0~31
月・・・0~12
曜日・・0=日曜日、1=月、2=火、・・・、6=土、7=日
「*」はすべてを意味します。SSL証明書の自動更新のスケジュールの[月]パラメータにすべてを指定しているので毎月という意味になりますね。