経験知ロゴ

nginx + WordPressでSSL(HTTPS)を設定する方法

※本ページはプロモーションが含まれています

nginx
ブログをHTTPS化することでGoogleの検索結果が優位になります。
参考:「ブロガーのためのHTTPS(SSL証明書)入門

新しいブログを立ち上げる際にCentOS + nginxの環境でHTTPS化したのでその方法を紹介します。

SSLの取得と設置

SSL証明書を置くフォルダを作成。

$ sudo mkdir /etc/nginx/ssl

作成した「ssl」フォルダへ移動。

$ cd /etc/nginx/ssl

Keyファイルの作成。作成するファイル名は自分が好きな様に決めてよいが、作成年をファイル名に入れておくとSSLを更新する際に分かりやすいので「2015」とつけている。

$ sudo openssl genrsa -out 2015.example.com.key 2048

KeyファイルからSSL業者へ申請するCSRファイルを作成。

$ sudo openssl req -new -key -sha256 2015.example.com.key -out 2015.example.com.csr

質問に答えながら進む。入力する情報はWhois情報をもとに一例として紹介。「←」部分が入力する場所

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:←Registrant Country
State or Province Name (full name) []:←Registrant State/Province
Locality Name (eg, city) [Default City]:←Registrant City
Organization Name (eg, company) [Default Company Ltd]:c/o WHOIStrustee.com Limited
Organizational Unit Name (eg, section) []:←入力せずそのままEnter
Common Name (eg, your name or your server's hostname) []:←Domain Name
Email Address []:←入力せずそのままEnter

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:←入力せずそのままEnter
An optional company name []:←Registrant Name

作成したcsrファイルを開いて内容をコピーし、SSL発行業者の「CSR入力欄」にペースト。
参考:「格安SSL証明書の取得手順を紹介【SSLボックス】

$ sudo vi 2015.example.com.csr

SSL業者から送られてきた証明書(ここではshomei.crtとする)と中間証明書(chukan.crtとする)を「/etc/nginx/ssl」へアップロードし、証明書・中間証明書の順で結合する。作成に失敗する場合はスーパーユーザになって実行する。

$ sudo cat shomei.crt chukan.crt > 2015.example.com.crt

DH鍵交換に使用するパラメータファイルをsslフォルダ内に作成。

$ sudo openssl dhparam 2048 -out dhparam.pem

nginxでのHTTPSの設定

「nginx.conf」の設定。リバースプロキシキャッシュを使用しての設定。

$ sudo vi /etc/nginx/nginx.conf

設定に必要な部分と全体像。

http {

 …
    # ここからヘッダ。
    proxy_set_header  Host               $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-Server $host;
    proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for; 

    upstream backend {
        ip_hash;
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name www.example.com;
        rewrite     ^ https://example.com$request_uri?;
    }
 
    server {
        listen 80;
        server_name example.com;
        rewrite     ^ https://example.com$request_uri?;
    }

    server {
        listen       443 ssl;
        server_name  example.com;

        ssl_certificate      /etc/nginx/ssl/2015.example.com.crt;
        ssl_certificate_key  /etc/nginx/ssl/2015.example.com.key;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_prefer_server_ciphers   on;
        ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';

        add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';

        # サーバ全般の指定
        location / {

         …#通常の設定

        }
    }
             
    # バックエンドサーバの設定(こちらはポート8080の設定)
    server {
        listen       8080;
        server_name  example.com;

        location / {
         
           …
 
        }
    }
} # http

nginxを再起動

$ sudo service nginx restart

WordPressの設定

「wp-config.php」に下記コードを追加。

  define('FORCE_SSL_ADMIN', true);
  if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
       $_SERVER['HTTPS']='on';

但し、

require_once(ABSPATH . 'wp-settings.php');

より上に追加しないと

Notice: Constant FORCE_SSL_ADMIN already defined in …

というエラーが出てしまうので注意。

おわりに

SSLの設定ができてもWordPressの管理画面にログインできずに何日も悩んでいましたが「FORCE_SSL_ADMIN」を書く位置を間違えていただけでした。。。

役に立ったらこの記事のシェアをお願いします

ブログのフォロー・RSS購読は下記ボタンから