さくらのレンタルサーバーで立ち上げたWordPressを完全SSL対応(鍵緑)にするメモ

レンタルサーバーで安く安定した環境を構築する週末

世間はMastodonインスタンス立ち上げがDockerDockerおきているわけですが、この週末は仕事で使うWordpressの整備などに充ててしまいました.

ちょうど最近はレンタルサーバー各社を比較していて,さくら・GMO・Kagoyaなど,月1万円以下のVPSやレンタルサーバーの運用上の評価を行っておりました.レンタルサーバーで安く安定した環境を構築する週末,まあ時間の浪費かもしれませんが「趣味の盆栽」とでも思えば耐えられる.

この業界横並びで,ここ2年ぐらいの傾向としては,SSDなどの増量,共有SSL(SNI;Server Name Indication)対応,Webフォント対応などが主な機能です.あとはコントロールパネルが見やすいかとか,値段は実は結構違いますが,年間数千円の違いといったところでしょうか.

最近の共有SSLはリバースプロキシで実装されている

昔はSSLといえば,固定IPとった上にお高い(数万円/年)印象がありますが,SNIであれば年間数千円,キャンペーンで初年度無料といった価格で入手できます.そもそも2015年以降,GoogleがSSL非対応サイトの評価を大きく下げたことも影響しています(参考:GMOによる解説).

そもそも純然たるSSLと違いって,共有SSLは「保護された通信」とだけ出ます.表示は鍵と緑です.EV証明書がある接続はブラウザのURLの左に鍵緑に加えて,証明機関の名前が出ます.共有SSLはそもそもIPアドレス共有していても名前ベースの認証(SNI)で解決しているので,もしかすると同じIPをもったレンタルサーバーのユーザが(鍵をすべて入手するなど)成り済まそうと思えばできなくもない仕組みです(参考:富士通による詳細で簡単な解説).

また,通常,HTTPとHTTPSはアクセスするサーバーポートが80番と443番と異なります.自サーバーでのHTTPSの設定は,あくまで別のディレクトリ,別のサーバーとして設定していくことが多いのですが,さくらのレンタルサーバーの場合は,明示的にHTTPとHTTPSの仮想サーバー設定(具体的にはhttpd.conf)を触らせてくれません.例えば「www.domain.org」と「domain.org」のHTTPとHTTPSのアクセス先の挙動4種類をそれぞれ変える設定がしたい場合などが大変.デフォルトはwwwとwwwなしを同じディレクトリ,さらにHTTPとHTTPSをリバースプロクシで自動設定,です.それをコントロールパネルだけで設定できなくもないですが,ログも見えないのでとても作業は大変です.レンタルサーバーはそういうところがつらい,一方でサーバスペック的にはお安く上がっているし,セキュリティもさくら任せなので文句も言いづらいところ.

さくらのmod_rewriteの仕様が変わっている(うまくいかない設定例)

もちろん共有SSLが流行り始めて2年ですので,いろいろな人々がさくらのレンタルサーバーWordpress環境で共有SSLに挑戦しています.鍵緑状態になった実績がある設定としては,.htaccessにリバースプロクシによってHTTPSになった状態を判定する「HTTP:X-Sakura-Forwarded-For」を使って mod_rewriteを書く方法,そしてwp-config.phpに消えてしまったサーバ変数を明示的に書く方法.でも結論から言うとこれはうまくいきません(2017/4/16確認).

.htaccess全体
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/robots.txt$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{ENV:HTTPS} !^on$
RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
RewriteRule ^(.*)$ %{HTTP_HOST}%{REQUEST_URI} [R=301,L]
wp-config.php 追記分
// プロクシでIPが入るとSSLアクセス状態をセットする
if( isset($_SERVER[‘HTTP_X_SAKURA_FORWARDED_FOR’]) ) {
 $_SERVER[‘HTTPS’] = ‘on’;
 $_ENV[‘HTTPS’] = ‘on’;
 $_SERVER[‘HTTP_HOST’] = ‘domain.org‘;
 $_SERVER[‘SERVER_NAME’] = ‘domain.org‘;
 $_ENV[‘HTTP_HOST’] = ‘domain.org‘;
 $_ENV[‘SERVER_NAME’] =’domain.org‘;
}
上記の参考にしたURLのいくつかでも2017年4月の追記で「さくらではリバースプロクシのmod_rewriteをサポートしない」という話がいくつか出ています.で,そういうサイトはURLが鍵緑ではなく「混在」になっています(このサイトはまだSSL設定していないので「保護されていません」です).
なお,これのおかげで最強のバックアッププラグイン「BackWPup」なども動かない説もあり.

WordPressのCSSだけ崩れる問題と Really Simple SSL

上記の設定でも「共有」まではいきます,少なくともサイトのアクセストップだけは鍵緑になりますが,ソースを見てみると,テーマのCSSへのアクセスだけが「http://自サイト」になっており,クリックするとリダイレクトでHTTPSになります.設定によってはHTTPとHTTPSでリダイレクトループに入り,サイトが表示されなくなります.問題は上記のリバースプロクシと,rewriteに起因するのですが,細かい設定ができないから仕方ない.
このような問題を解決するためのプラグインとしていくつかのサイトでは「Really Simple SSL」プラグインが便利であったと書かれています.ですがこれは時間の浪費でした.このプラグインは3つの機能があり,Wordpressによるリライト,301リダイレクト,JavaScriptによるリライトを実施し,サイトやコンテンツを一つ一つ書きなおさなくてもよい…という触れ込みです.実際には .htaccess を勝手に書き換えますので,上記の特殊仕様が入っている環境では慎重に使ったほうが良いと思います.私はこいつのおかげでとてもはまりました.上記のさくら特有の設定などは無視ですので.

どうやって解決するか?

さて,今回の問題ですが,結局以下のような解決策をとりました.
(1) コントロールパネルは[www]と[wwwなし]を共用,.htaccess はできるだけシンプルに
(2) wp-config.php には上記のサーバー変数を一応書いておく.コントロールパネル「一般」のサイトアドレスはhttpsのwwwなしで統一.
(3) サイトにアクセスして,ソース表示して,CSS以外はhttpsでアクセスできていることを確認する(表示は崩れている).
(4) 「SSL Insecure Content Fixer」というSSL用のリライトプラグインを導入
 インストールして設定で「Capture, unable to detect HTTPS」にチェックするだけ.おそらくリライト後のHTML全部をキャプチャして http:// になっているところを書き換えている,とても重い処理と思うのだが,たくさんあるわけではないし,要はこれをやってほしかっただけなので,もうこれでいいと思う!.htaccessに怪しい設定するほうが危険だし,リダイレクトループに入っている頃に比べれば全然快適に動いています.一日悩んだけど解決してよかった!

おまけ:レンタルサーバ公式のプラグインがあればいいのに…と思ったら

さくらのサーバー向けにSSL対応させるWordpressプラグインがあればいいんですよね,実際WordpressのプラグインでSSL関連を見ていると「CloudFlare Flexible SSL」などCDN業者提供のプラグインもちらほら見えます.最近提供されているWebフォント「TypeSquare」なんかもさくらGMOお名前.comも同じようなサポートプラグインをWordpressのプラグインで出しているから,できることなんじゃないかと思います.ちなみにTypeSquareはどちらの会社も月間25000PVまでは無料という微妙な設定ですが,さくらは9,000インストール,GMOは100以下….
っていうか「Sakura」でWordpressプラグイン検索してたら「さくらのレンタルサーバ 簡単SSL化プラグイン 作者: SAKURA Internet Inc.」ってプラグインがあったのですけど!早くいってよ!…ってことで試してみました.

重大なエラーを引き起こしたため、プラグインを有効化できませんでした。

Fatal error: Arrays are not allowed in class constants in /home/user/www/wordpress/wp-content/plugins/sakura-rs-wp-ssl/modules/model/force-ssl.php on line 32

おあとがよろしいようで….そもそもインストールできないレベルだと試せない,まあこのドキュメントは役に立ちそう.