Let's Encryptで常時SSL化してみた話(サーバ証明書と秘密鍵をApache2の設定に反映する〜)
悪夢の自己(オレオレ)証明書を置き換えよう
Apache2 の "/usr/local/apache2/copnf/extra/httpd-ssl.conf"ファイルを修正し、自己(オレオレ)証明書を使用していた箇所を Let's encrypt から取得した証明書に書き換える。
$ sudo vi /usr/local/apache2/copnf/extra/httpd-ssl.conf
|
# 変更箇所は以下の部分
SSLCertificateFile "/etc/letsencrypt/live/y-naito.ddo.jp/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/y-naito.ddo.jp/privkey.pem"
|
これまでずっと http で運用してきたので、検索エンジンにヒットする記事や誰かにブックマークされているURLは http ばかりだろう。また、自分が書いた過去記事へのリンクも http だが、これらを全部修正するのには大変な手間がかかる(正直やってられない)。
そこで、http での接続を httpsに転送してやるようにする。これをリダイレクトと言い、いくつかの方法が存在するが、ここでは mod_rewrite を使用している。
$ sudo vi /usr/local/apache2/conf/httpd.conf
|
# 先頭の#を削除
#LoadModule rewrite_module modules/mod_rewrite.so
↓
LoadModule rewrite_module modules/mod_rewrite.so
〜
# 以下を追加
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !/.well\-known/acme\-challenge/.*
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [L,R=301]
</IfModule>
|
注)「¥」は実際には半角の「\」(バックスラッシュ)。
http でアクセスして来たら全部 https に書き換えてやれば良いわけだが、".well-known/acme-challenge/"に対する httpアクセスだけは除外している(RewriteCondを複数行続けると、それらはAND条件になる)。この場所は証明書の取得の際に作成したディレクトリで、証明書の更新の際も Let's encrypt が HTTPプロトコルでアクセスして来るので、https にリダイレクトされては都合が悪いからだ。
また、httpsへリダイレクトできるようになったら、HSTS(HTTP Strict Transport Security)も導入した方が良いだろう。HSTSとは、httpで接続すると httpsへリダイレクトし、以降そのドメインへの接続はすべて httpsとする機能で、主要なWebブラウザでは殆どサポートされている。
Apache2 での設定は"/usr/local/apache2/conf/extra/httpd-ssl.conf"に以下のように"Header set"を追加する。
<VirtualHost _default_:443>
〜
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
〜
</VirtualHost>
|
設定を反映するため、Apache2 を再起動する。
$ sudo /usr/local/apache2/bin/apachectl configtest
Syntax OK
$ sudo /usr/local/apache2/bin/apachectl restart
$
|
この後、"http://y-naito.ddo.jp/" にアクセスし、"https://y-naito.ddo.jp/"の方へリダイレクトされてSSL通信になるか、証明書が正しいかを確認する。
ウチのホームページの証明書は以下のとおり Let's Encryptによって認証されたものになり、これで自己(オレオレ)証明書のようにWebブラウザにシバかれることも無くなった。
|