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をインストールする
Sponsored Link

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化されているのでアドレスバーの横に鍵マークが表示されていると思います。

Sponsored Link

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証明書の自動更新のスケジュールの[月]パラメータにすべてを指定しているので毎月という意味になりますね。