NginxでWordPressのログインをSSLにしてみよう

最近(というわけでもないか?)ユーザパスワードの流出問題をよく聞く。以前から自分のサイトへのログインをSSLで通信した方が良いのではと思っていたが、ブログもレンタルサーバからさくらのVPSに移行したことだし、WordPressをSSLにしてみる。

サーバ証明書を買うか買わないか

サーバ証明書も安くなって個人でも手を出せるようになってきたと聞く、http://www.rapid-ssl.jp/を調べてみたが、2012/06の時点で年額2,600円(税込)。確かに安い。が面倒なことにRedmineのログインもセキュアにしたいのに、別のサブドメインにしているのでサーバ証明書がサブドメインごとに必要になってしまう。

冷静に考えれば自分(だけ)が自分のサーバに接続するのにサーバの証明の何もないので今回はサーバ証明書を買うのを諦めてオレオレ証明書を使うことにする。

オレオレ証明書の作成

openssl req -new -newkey rsa:2048 -nodes -keyout blog.example.com.key -out blog.example.com.csr
openssl x509 -in blog.makotokw.com.csr -out blog.example.com.crt -req -signkey blog.example.com.key -days 3650

自分しか使わないことをいいことにパスフレーズなしで期限も長くしているので良い子は真似しないように。

nginxでSSLを設定する

server {
    listen               80;
    listen               443  ssl;
    server_name blog.example.com;

    ssl on;
    ssl_certificate      /etc/certs/blog.example.com.crt;
    ssl_certificate_key  /etc/certs/blog.example.com.key;

http/https両方で公開するので80と443の両方でlistenする。前手順で作成した証明書と秘密鍵のパスを設定。

/etc/init.d/nginx reload

で再起動。

WordPressの設定

WordPressでSSLの上で管理ページを使う方法は以下のドキュメントに記載されている。
Administration Over SSL

望んていた機能。WordPress 2.6以上で使え、ログインや管理ページ全般のみをSSLにすることができる。方法としては2つあっていずれのdefineをwp-config.phpに記載する。

1) ログイン時だけSSLを使う
define('FORCE_SSL_LOGIN', true);

2) ログインと管理ページでSSLを使う
define('FORCE_SSL_ADMIN', true);

入れる場所はwp-settings.phprequire_onceよりも前ならどこでも良い。

今回はログインだけセキュアにすれば満足なので1の方法を使う。セッションクッキーとか知ったこっちゃない。

設定後もログインページがSSLじゃないのだが、ソースを見てみるとformのポスト先はhttpsになっていた。そしてログインしようとするとブラウザに以下のように警告される。

blog.makotokw.com は不正なセキュリティ証明書を使用しています。
自己署名をしているためこの証明書は信頼されません。

OKじゃないけど、今回の手順では正常系。

まとめ

今回は自分が自分のサーバにログインするときのパスワードを暗号化する。というのが目的だったのでオレオレ証明書を使ってWordPressのログインページだけをSSLで通信するように設定した。対象が自分だけなので許されるが今回の手順はセキュリティ的にはそれほど良いものではないので、自分以外のユーザが使うようなケースではセキュリティについてよく検討した上で参考にしていただきたく。