Nginx+Apache+WordPressをSSL化して鍵マークがついた

WordPressが鬼門

複数のWebサーバを使用しているので、フロントにNginxをリバースプロキシとして置いています。

昔は、複数のドメインを使用していましたが、今はこのブログ用の一つだけですので、安い、さくらインターネットで買える「SSL JPRS ドメイン認証型(1年)」にしました。

Apacheはいじりませんが、NginxとWordPressの設定が面倒で、結局10時間ぐらいかかりました。

NginxのSSL化手順

まず、鍵とCSRファイルを作ります。

cd /etc/nginx
mkdir ssl
cd ssl
# openssl req -new -newkey rsa:2048 -nodes -keyout {鍵ファイル名}.key -out {CSRファイル名}.csr

Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Kochi ← 都道府県名
Locality Name (eg, city) [Default City]:Kochi ←市町村名
Organization Name (eg, company) [Default Company Ltd]:None  ← 法人なら企業名
Organizational Unit Name (eg, section) []:None
← 法人なら部門名
Common Name (eg, your name or your server's hostname) []www.naruppe.info ← サイトのアドレス
Email Address []:メールアドレス

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

さくらインターネットのページで、SSL証明書を入手する必要があります。

サーバ証明書をさくらインターネットから入手するには、その前に認証局に「ちゃんとWebサーバは生きているよ」的なことを教えるためのファイルをさくらインターネットのSSLサービス画面からダウンロードして、所定のWebサーバのドキュメントディレクトリに置きます。

しばらくすると、同じさくらインターネットの画面でサーバ証明書がダウンロードできるようになります。また、中間CA証明書のインストールが必要となります。さくらインターネットからのメールには書いてあったのですが、きずかずに時間を浪費しました。jprsからドメイン認証型(DV)の中間CA証明ファイルをダウンロードして、サーバ証明書と一つのファイルにして証明書関係の配置ディレクトリに置きます。

cat /tmp/JPRS_DVCA_G2_PEM.cer >> crtファイル

ここで注意:cerのファイルを追加した時、サーバ証明書の最終行と中間CA証明書の開始行が改行されていないとnginxのフォーマットチェックでエラーになります。===の入っている行がちゃんと二行になるようにしましょう。

/etc/nginx/conf.d/default.confにSSLの記述を追加します。

まず、httpできたらhttpsにリダイレクション。

server {
    listen       80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
}

SSLの設定

server {
    listen       443 ssl;
#    server_name  _;
    server_name  naruppe.info;

## for SSL
    ssl             on;
    ssl_certificate /etc/nginx/ssl/{crtファイル名};
    ssl_certificate_key /etc/nginx/ssl/{鍵ファイル名};
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

大変なのはWordPress

httpsでアクセスすると、リダイレクションが掛かりまくって、うまく表示してくれません。WiresharkやSafariの開発機能で追っかけてもよくわからず。結果としては、以下でできました。

    1. WordPressで使っているDB内のwp_optionsテーブルのsiteurlとhomeの値をhttpからhttpsに変える。(これにはSequel Proを使いました)
    2. wp-config.phpを編集する。
      define('WP_DEBUG', false);
      define('FORCE_SSL_ADMIN', true);
      if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
        $_SERVER['HTTPS']='on';
      }
    3. プラグインのSearch Regexを入れて、「ツール」の中のSearch Regexを使って、「http://www.naruppe.info」を「https://www.naruppe.info」に変える。
    4. ApacheとNginxを再起動!

夜中の1時超えでなんとか動作

以上で、とりあえず問題なく動作しています。色々、ググって先達の方に教えていただきました。ありがとうございました。