常時SSL化の為にやったこと

WordPressサイトの常時SSL化のために実施した作業をメモしておきます。

1. SSL証明書の購入

SSL化するには自己証明書では意味がありませんので正式なサーバ証明書を購入します。個人のサイトなので自己証明でなければなんでも構いません。ということで今回はSSLボックスのCoreSSLを利用しました。

2.ドメイン認証のためのメール受信設定

ただしドメイン認証の場合は、WHOISに登録されているアドレスか、postmaster@コモンネームなどのメールアドレスに届いたメールの操作が必要となります(参考
メールの受信設定を行うため、以下の設定を一時的に追加しました。

iptablesにメール受信用の穴をあけます。

# vi /etc/sysconfig/iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP 
 -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
 -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
+ -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT #25番ポートを開放
# serive iptables restart

メールサーバ(postfix)が自ドメイン宛メールを受け取れるように設定変更

# vi /etc/postfix/main.cfmyhostname = mail.riscascape.net
mydomain = riscascape.net
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown

※Linuxの新規ユーザに、標準でメールフォルダを作成する設定を追加
# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/

※Linuxにwebmasterユーザを追加
# useradd -s /sbin/nologin webmaster
webmaster

※postfix設定変更反映
# service postfix restart

DNSサーバにriscascape.netメールサーバの設定を追加する必要があります。
dns_server_mxrecord

これでドメイン認証用のメールを受信できるようになりましたので、証明書発行の処理とサーバへの証明書登録を進められます。

3. 証明書インストール

インストール方法はサーバの組み合わせによりいろいろあるので、GlobalSignの解説ページを参考にするのがお勧めです。

4. SSL化(https化)のテスト

証明書インストールが終わったら、httpsでアクセス可能かテストします。
ブラウザのURLをhttpsにするだけでも最低限のアクセスチェックは出来ますが、テストサイトを利用してSSLv2/SSLv3無効化などの推奨される設定が行われているかの確認もしましょう。

■SSL Checker | Symantec CryptoReport
https://cryptoreport.websecurity.symantec.com/checker/views/certCheck.jsp

■SSL Server Test (Powered by Qualys SSL Labs)
https://globalsign.ssllabs.com/

5. 記事内画像URLの相対パス化

WordPressは特に何もしなくても基本的にはhttps化に対応していますが、コンテンツ内の画像URLはhttpのままなのでアドレスバーの鍵マークが表示されません。
SQLでhttpをhttpsに置換しても良いですし、置換プラグインを使うのも手だと思います。
keyicon_beforeafter

この時httpをただhttpsに置換するだけではなくドメイン部分まで削除して相対パス化するのも手です。DNS参照が減るので体感できないレベルではありますが表示が高速化されます。

■Parcferme 8号帆布の一眼用3Wayバッグ
<a href="http://www.riscascape.net/wp-content/uploads/2015/04/Parcferme_1.jpg"><img src="http://www.riscascape.net/wp-content/uploads/
↓
■Parcferme 8号帆布の一眼用3Wayバッグ
<a href="/wp-content/uploads/2015/04/Parcferme_1.jpg"><img src="/wp-content/uploads/
6. WordPress内部生成URLの相対パス化

相対パス化といえば、WordPressの内部生成URLも相対パス化することができます。

■絶対パスを相対パスにする(WordPress)
http://www.7-16.jp/絶対パスを相対パスにするwordpress/201504/

# vi /var/www/html/wp-content/themes/simplicity-child/functions.php//絶対パス→相対パス
class relative_URI {
    function relative_URI() {
        add_action('get_header', array(&$this, 'get_header'), 1);
        add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
    }
    function replace_relative_URI($content) {
        $home_url = trailingslashit(get_home_url('/'));
        return str_replace($home_url, '/', $content);
    }
    function get_header(){
        ob_start(array(&$this, 'replace_relative_URI'));
    }
    function wp_footer(){
        ob_end_flush();
    }
}
new relative_URI();
7. WordPressアドレス/サイトアドレスを変更する

WordPress管理画面 → 設定 → 一般設定 のWordPressアドレス/サイトアドレスもhttpsに修正します。
https_wordpresss_generalsettings

8. はてなブックマークの数値を取得できない問題を解決

SSL化後、はてブ数を取得できなくなりました。幸にもSimplicityテーマのフォーラムにナレッジがありましたので参考にします。

■SSL化したときのはてブ数が表示されない | Simplicity
http://wp-simplicity.com/suport/topic/ssl化したときのはてブ数が表示されない/

9. httpsへのリダイレクト & HSTS設定

WordPressはhttp/httpsどちらにも対応しているので、http://で検索エンジンに登録されている場合はhttpサイトで表示できてしまいます。
リンク切れにならないだけでありがたいのですが、Apacheでhttpsサイトにリダイレクト処理をかけます。

設定内容は「httpsでないURLでアクセスされた場合はhttpsにリダイレクトをかける」という処理

# vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
 DocumentRoot /var/www/html
 ServerName www.riscascape.net
 ServerAlias riscascape.net
+ <IfModule mod_rewrite.c>
+   RewriteEngine on
+   RewriteCond %{HTTPS} off
+   RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
+ </IfModule>

もう一つ、最近覚えたHSTS(HTTP Strict Transport Security)の設定をssl.conf側に追加します。
一言でいうと「httpsでアクセスしたことをブラウザ側に登録させて次回アクセスは強制https化しますよ」という機能です。
期限のmax-ageは315360000秒・・・・1年間を意味します。

# vi /etc/httpd/conf.d/ssl.conf

<VirtualHost _default_:443>
  DocumentRoot /var/www/html
  ServerName www.riscascape.net
  ServerAlias riscascape.net
+ Header set Strict-Transport-Security "max-age=315360000; includeSubDomains"
</VirtualHost>

ということでサイトのSSL化手順でした。
今回は項番1~7までを少しずつ実施し、常時SSL化の仕上げとして項番9を実施、その後はてブ数の問題が分かったため項番8を実施、という順番で作業していました。技術的なハードルはほとんどないと思いますが、税込1,000円程度とはいえ追加投資が必要なSSL証明書購入が一番のネックでしょうか。

次回は、私自身も一番気になっていた常時SSL化前後のhttpレスポンスを取り上げる予定です。