さくらのレンタルサーバとSSL


CGI プログラムからセキュア通信の判定をする

さくらインターネットレンタルサーバでは、共有サーバであるにもかかわらず独自ドメインにSSLサーバ証明書を設定して通信を暗号化することができます。
しかも、無料SSLサーバ証明書というサービスが提供されている(注1)ので通信を暗号化させる際のハードルもより一層低くなってきました。
しかし、共有サーバで暗号化通信を実現させていることで、単純に構築されたサーバとは異なる工夫が必要になってきます。その一端を挙げたいと思います。

プログラムで暗号化通信の判定

一般的には、環境変数にHTTPS=onが設定されていることで暗号化通信でアクセスされたかどうかを判断することができます。
しかし、さくらのレンタルサーバでは、プログラムが動作しているサーバの手前に何かのゲートウェイが存在しています。そのゲートウェイと、プログラムが動作しているサーバの間では平文で通信が行われているようです。そのためか、環境変数にHTTPSは設定されていません。
暗号化通信を強制するために次のような内容を.htaccessに設定することを紹介しているのも、このことが原因です。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/robots.txt$
    RewriteCond %{REQUEST_URI} !^/404error.html$
    RewriteCond %{ENV:HTTPS} !^on$
    RewriteCond %{HTTP:X-SAKURA-FORWARDED-FOR} ^$
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

しかしこれらの設定だけでは、プログラムの中で暗号化通信でアクセスされたのかを判定することはできません。
先にも示したように、環境変数にはHTTPS=onが設定されていないためです。
設定されていないのならば、設定してしまえば良いのではないでしょうか。
そこで、次のような内容を.htaccessに設定してみることにします。

<IfModule mod_setenvif.c>
    SetEnvIf X-SAKURA-FORWARDED-FOR ^.+$ HTTPS=on
</IfModule>

次のようなプログラムで環境変数を確認してみると、暗号化通信でアクセスした場合にHTTPS=onが設定されていことが確認できます。

<?php
    echo phpinfo();

注記

注1
2017年12月15日時点で確認しています。