nginx + WordPressでSSL(HTTPS)を設定する方法
※本ページはプロモーションが含まれています
ブログを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」を書く位置を間違えていただけでした。。。