WordPressサイトをhttps対応するながーい道程
WordPressで作成されているこちらのサイト、https対応しました。
なんだかいろいろなところに手を入れました。
きっと俊足で忘れていきそうなのでメモします。
サーバはcentos6.5、webサーバはnginxです。
証明書を発行してもらうまで
証明書を発行してもらうには、まずサーバ上でkeyファイル(秘密鍵)、csrファイル(SSL通信に利用する公開鍵に、ドメイン名や組織名などの情報を付加したもの)を作成します。
パスワードが必要になりますので、準備しておきましょう。
centosでのkeyファイルの作成用コマンドはこんな感じ。
openssl genrsa -des3 -out ./XXXXXXXX.key 2048
注意ポイントは「秘密鍵のファイル名は、既存の秘密鍵ファイルを上書きしないよう気をつける」ことです。
csrファイルの作成用コマンドはこんな感じです。
openssl req -new -key ./XXXXXXXX.key -out ./XXXXXXXX.csr
上記コマンドを入力すると、下記の情報を聞かれるので、順次入力していきます。
コモンネーム CN 実際に接続するURLのFQDN ドメイン名
組織単位名 OU 部署名(任意)
組織名 O 申請組織の名称(英名)
市町村名 L 申請組織の事業所住所の「市区町村名」(英名)
都道府県名 S/ST 申請組織の事業所住所の「都道府県名」(英名)
国名 C 申請組織の国名(JP固定)
※組織単位名以外は必須入力です。
ここで入力する内容と、ドメインのwhois情報の内容が一致している必要があります。
whois情報公開代行を使用している場合は、代行先の情報に沿った内容の入力が必要です。
お名前.comのWhois情報公開代行を使ったまま、RapidSSLのSSL証明書を発行する方法
whois?何だっけ?となったらwhois検索すると必要な情報が取得できます。
ここで表示される組織名、市町村名などを使用してcsrを作成しましょう。
WHOIS検索
csrファイルの作成ができたら、証明書の発行を依頼しましょう。
証明書の認証レベルも、レベルの低いものから順にドメイン認証、企業認証、EV認証、とあり、レベルや知名度に伴って、証明書の価格も無料のもの(自作オレオレ証明書)からお手頃価格のもの(年1000円クラス)、なかなかお高いもの(年2万円クラス)、超高額のもの(年20万円クラス)までいろいろとあります。
今回はドメイン認証&お手頃価格のものにしました。
ここからは申込先によって操作内容が異なりますが、発行依頼を行う際には前で作成したcsrファイルの内容を入力する必要があります。
発行依頼をして、しばらく待って、発行依頼先の操作手順に沿ってなんやかんややると、晴れてSSLサーバ証明書が発行されます。
証明書をサーバにインストールするまで
SSLサーバ証明書が取得できたら、それと中間証明書をサーバにインストールします。
中間証明書は、証明書発行依頼先によってこれまた異なります。
nginxでの証明書の設定方法については、下記のページを参考にさせていただきました。
SSLサーバ証明書と中間証明書を連結したpemファイルを作成します。
nginx + rapid-ssl導入 – わかりやすいよ
そしてnginxの設定ファイルはこんな感じになりました。
server {
listen 80;
server_name _;
return 301 https://$host$request_uri; # 普通のhttpでアクセスが来たらhttpsに投げちゃう
}
server {
listen 443;
server_name _;
root /var/www/vhosts/default;
index index.html index.htm index.php;
charset utf-8;
ssl on; # ここはONです
ssl_certificate XXXXXXXX.pem; # さっき作ったpemファイルの場所
ssl_certificate_key XXXXXXXX.key; # 最初に作ったkeyの場所
ssl_session_timeout 5m; # タイムアウト時間
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 使用するSSLのバージョンを指定します
ssl_ciphers HIGH:!ADH:!MD5; # 暗号化方法を設定します
ssl_prefer_server_ciphers on; # サーバで指定した暗号化方法を優先します
#あと省略
}
そして、443ポートを閉じていたので、iptablesを設定して443ポートを開きました。
wordpressが使えるようになるまで
で、httpsで接続してみたのですが、なんだかうまくいきません。
どうもnginxのreloadで設定がうまく読み込み直されていない風。
仕方がないので
nginx -s stop
してから
nginx
しました。(keyファイル・csrファイル作成時に使ったパスワードが必要になります。)
これでどうやらhttpsで接続できるようになったようです。
が、サイトの方は表示されるのですが、管理画面が出てきません…。
「ERR_TOO_MANY_REDIRECTS」的なエラーが出ています。
管理画面のhttpsが延々とリダイレクトループされています。
なんでかな〜?
wp-login.phpのソースを見てみると、次のようになっています。
ここのis_ssl() がfalseのせいで、延々とhttpsがリダイレクトされるようです。
// Redirect to https login if forced to use SSL
if ( force_ssl_admin() && ! is_ssl() ) {
if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ) );
exit();
} else {
wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
exit();
}
}
試しにwp-login.phpのリダイレクトをコメントアウトしてみると、管理画面のログイン画面は出るものの、ログインしようとすると「権限がありません」と出てしまって結局管理画面が使えません。
対応として、wp-config.phpに下記の設定を書き足しました。
define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS'] = 'on';
これでis_ssl() がtrueになって、リダイレクトループしないようになり、管理画面が開けるようになりました。
ほかの表示が変なところをいろいろと直すまで
サイト内で読み込んでいるいろいろなファイルが「http」になっているせいで、cssファイルがちゃんと読み込めていないとか、jsファイルがちゃんと読み込めていないとか、画像がちゃんと読み込めていないとかで、表示がへんてこになっていました。
https接続したときにアドレスバーに表示される鍵マークがちゃんと出ません。
対応としては、httpでファイルを取得している箇所をhttpsに変更します。
まず、テンプレートファイル(header.phpとか)にcssファイルやjsファイルのパスを直接「http://〜」と書いているところは軒並み「https://〜」にします。
そして、設定→一般より、WordPress アドレス (URL)とイトアドレス (URL)に記載しているURLを「https://〜」にします。
それから、記事内で使用している画像ファイルですが、これは手動で変えるのがとても面倒なのでプラグインを使用しました。
Search Regex
これでだいたい全部httpsになります。
そのほか、ソーシャルボタンを修正したり、エラーを直したりしました。
こう見ると大した作業をしていなさそうなのですが、試行錯誤が長かったためやたら時間がかかってしまいました。(特に管理画面が出ないところ)
まだ表示が変なところがあるかもしれませんので、ぼちぼち直していこうと思います。
道程は長いですね…。
-
前の記事
重い旧型iPhone/iPadを少しでも軽くするためのいろいろ 2016.09.10
-
次の記事
超速midi作曲iOSアプリ「テキスト音楽(TextMusic)」活用事例 2016.09.20