Let’s Encryptを使ってサイトをSSL(http2)化した


PB031432

http2化を試したいなと思っていたもののなかなか時間が取れずに遅れてしまったが、ちょっと時間が出来たのでLet’s Encryptを使ってサイト(WordPress)をSSL化した。また、nginxも1.9.9にアップグレードしてhttp2対応した。

広告

環境

  • Ubuntu 14.04 LTS
  • nginx 1.9.9
  • PHP 5.5.9-1ubuntu4.14

Let’s Encrypt

Let’s Encrypt – Free SSL/TLS Certificates

Let’s Encrypt自体の設定は非常に簡単だった。

証明書を作成する際にport 80を使うようなので80番ポートをlistenしてるプロセス(apacheやnginxなど)は停止しておく必要がある。

すると、 /etc/letsencrypt/live/fukata.org/ 以下に cert.pem、chain.pem、fullchain.pem、privkey.pem が生成されるので後はコレをnginxに設定すればいい。本番環境はAWSばっかり使っていたのでSSLの設定方法を忘れていた。

こんな感じに設定するだけでいい。http2を有効にするにはnginx 1.9.5以上で –with-http_v2_module を有効にしてコンパイルしないといけない。サイトで使っているnginxもコレを機に1.9.7から1.9.9にアップグレードしておいた。

ansibleでplaybook作っておいたのでコンパイルオプション変えて再実行するだけで完了するのはやっぱり楽。

これで、nginxを再起動すればSSL(http2)に対応しているはずだ。

WordPress

Let’s Encryptより手間取ったのがWordPressのSSL化。結論から言えば、プラグインなどをあまり入れてないシンプルな環境であれば難なく動作すると思う。

記事本文中のリンクのhttps化

こんな感じのスクリプトを書いてゴリッと対応した。個人のブログだしhttps化して表示されなくなったものに関しては無視!マルチサイトを使っていたので複数のwp_postsにも対応してる。

超久しぶりにFW無しでmysql接続するphp書いた。

is_ssl関数

当初、X-Forwarded-Proto “https”をphp側に渡せば良いかと思って設定した所、管理画面に入ろうとすると無限ループに。。。そこでやっと調べ始めるとどうやらis_ssl関数に問題があるようでWordPress v4.4時点の実装は下記のようになっている。

ということで、nginxのphp-fpm部分の設定に fastcgi_param HTTPS “on”; を追加して無事成功。

ネットを調べるとis_sslをいじって解決している人が何人かいるが可能ならhttpサーバからHTTPS情報なりを渡してあげたほうが将来functions.phpが更新されて困らないのでオススメ。

Memcached

すっかり使ってるのを忘れていたMemcached。DBの内容を削除してもnginxのキャッシュを削除しても内容が変わらなかったをしばらく考えてそういえばこいつがいたと思い出し再起動することで無事、記事内容が変更したものに変わった。

謎のhttps -> httpリダイレクト

なぜか、php側からhttps -> httpへリダイレクトしておりどこからリダイレクトされてるのか分からなかったので wp-config.php にて WP_DEBUG, WP_DEBUG_DISPLAY を有効にし、さらに wp-includes/pluggable.php にある wp_redirect関数に print_r(debug_backtrace()); を仕込んでどこから呼ばれてるのかを調査。

その結果、別に必要そうじゃなかったプラグインから呼ばれてたのでそのプラグインを無効化した。

無事リダイレクトされなくなった!

まとめ

Let’s Encryptで非常に手軽にSSL化出来るので皆もSSL(http2)対応やろう!

SSL証明書の有効期間が90日しかないので次回は無事更新出来るか試す。

関連記事