AWS上にWordPressで作成したブログサイトをSSL化(Let’s Encrypt)してみた

Linux

AWSのEC2インスタンスにWordPressで作成したブログサイトにSSL証明書を導入して
httpsによる通信を実施しようと思います。
「AWS Certificate Manager」を使うか迷いましたが、ELB(月額2000円ぐらい)を使用する構成にしないといけないので無料でSSL証明書を発行できる「Let’s Encrypt」を使用することにしました。

Let’s Encryptが発行する証明書の特徴

  • 米国の非営利団体であるISRG(Internet Security Research Group)というのが運営しているらしい。 
    ⇒ 非営利団体なので大丈夫かと思うが、FacebookやCiscoで採用しているらしいのできっと大丈夫。
  • 無料 
    ⇒ 有名なCA局の証明書だと数万円する。
  • 証明書の有効期限が90日しかない。
    ⇒ 定期的に証明書の更新が必要。
  • 認証レベルは「ドメイン認証(DV)」
    ⇒ 信頼性は低いが個人のブログサイトであれば十分と判断

[導入環境]
OS/ミドルウェア
・Amazon Linux(バージョン2)
・Apache(2.4.53)
[事前準備]
EC2インスタンス側に対して443/tcpが接続できるようになっていること(SG or ACL)

1. Certbot クライアントのインストール

Let’s Encryptによる証明書を使用するにはSSL証明書を発行するクアイアントツールを導入する必要があります。まずはその前提となるEPELパッケージをインストール。

# amazon-linux-extras install epel

続いて、certbotとcertbot用のapacheプラグインをインストール。

# yum install certbot python-certbot-apache

2. SSL証明書の作成

certbotコマンドで実際に証明書を作成します。

下記コマンドのオプションは -w [DocumentRoot] -d [WEBサイトのドメイン名]を指定。

# certbot certonly --webroot -w [DocumentRootのパス] -d [ドメイン名]

証明書の有効期限が近づいた際に知らせてくれる用のメールアドレスを指定します。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): 自身のメールアドレスを入力

次に規約に同意するので”Y”。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

電子フロンティア財団(Electronic Frontier Foundation) にメールアドレスを共有するか。
共有するとニュースとかキャンペーン情報を届けてくれるらしい。
特に不要なので”N”で。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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: N

完了後に下記パス配下に証明書が発行されます。

# ll  /etc/letsencrypt/live/[ドメイン名]/

cert.pem -> ../../archive/[ドメイン名]/cert1.pem
chain.pem -> ../../archive/[ドメイン名]/chain1.pem
fullchain.pem -> ../../archive/[ドメイン名]/fullchain1.pem
privkey.pem -> ../../archive/[ドメイン名]/privkey1.pem

3. Apacheの設定変更

apacheの設定ファイル(ssl.conf)を編集します。

# vi /etc/httpd/conf.d/ssl.conf

SSL証明書のファイルパスを下記指定で追記します。
※元々記載してあったデフォルトの定義はコメントアウトか行ごと削除しておきます。

SSLCertificateFile /etc/letsencrypt/live/[ドメイン名]/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[ドメイン名]/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/[ドメイン名]/chain.pem

「DocumentRoot」と「ServerName」も指定しておきます。

DocumentRoot "DocumentRootのパス"
ServerName [ドメイン名]:443

この状態で一旦httpdを再起動。

# systemctl restart httpd

4. 「wp-config.php」の設定変更

WordPress側の設定変更を実施していきます。
wp-config.phpにWordpressアドレスとサイトアドレスに「https://~」で接続するための下記行を追記します。

define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

5.「.htaccess」の設定変更

今の状態だとこれまで「http://~」でアクセスしてた人がアクセスできなくなるのでURLを「http」から「https」にリダイレクトさせるように、「.htaccess」ファイルに下記赤字3行を追記します。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

ここでhttpdを再起動します。

# systemctl restart httpd

6. httpsによる接続確認

この状態で「https://~」によるアクセスができると思います。
下記の様に鍵マークが付いていればSSL化されてます。

7. 証明書の自動更新設定

SSL証明書の有効期限が90日と短いため、定期的に更新する必要があります。
ただし、期限が切れる30日前から更新可能らしいです。
今回はcronに「証明書の更新とhttpdの再起動」を実施するコマンドを設定します。

# vi /var/spool/cron/root

この例では毎週日曜日の午前3時00分に実施するように設定。

0 3 * * 0 certbot renew ; systemctl restart httpd

以上で完了。

コメント

タイトルとURLをコピーしました