はじめに
Cloudflare では、以下の SSL mode を活用することで、Cloudflareーオリジン間の通信について、HTTPS を使うように制御できます。
Cloudflareーオリジン間の通信が、実際に HTTPS で行われるかどうかを調査します。
確認方法
オリジン Web サーバーに Apache を使います。
デフォルトでは Cloudflare によって、HTTP リクエストヘッダ X-Forwarded-Proto
と Cf-Visitor
は同じ値に設定されます。
How does Cloudflare handle HTTP Request headers? – Cloudflare Help Center
今回は、オリジンサーバーで以下のように接続プロトコルごとに X-Forwarded-Proto
を上書きするように設定を追加します。
RequestHeader set X-Forwarded-Proto "http"
<VirtualHost _default_:443>
RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
設定を反映するために、sudo systemctl restart httpd
でサービスを再起動します。
その後に、以下のコマンドで確認できます。
curl -s http://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
curl -s https://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
Cloudflareーオリジン間の通信が HTTP の場合
X-Forwarded-Proto: http
となります。
例えば、SSL mode を Flexible にした場合、クライアントーオリジン間を https
で接続すると、Cloudflareーオリジン間の通信は http
になります。
% curl -s https://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
Cf-Visitor: {"scheme":"https"} <br />
X-Forwarded-Proto: http <br />
Cloudflareーオリジン間の通信が HTTPS の場合
X-Forwarded-Proto: https
となります。
例えば、SSL mode を Strict (SSL-Only Origin Pull) にした場合、クライアントーオリジン間を http
で接続すると、Cloudflareーオリジン間の通信は https
になります。
% curl -s http://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
Cf-Visitor: {"scheme":"http"} <br />
X-Forwarded-Proto: https <br />
確認結果
以下のようになりました。
SSL mode | Client --> Cloudflare | Cloudflare --> Origin |
---|---|---|
Off | HTTP | HTTP |
Off | HTTPS --> HTTP (301 Redirect) | - |
Flexible | HTTP | HTTP |
Flexible | HTTPS | HTTP |
Full | HTTP | HTTP |
Full | HTTPS | HTTPS |
Full (Strict) | HTTP | HTTP |
Full (Strict) | HTTPS | HTTPS |
Strict (SSL-Only Origin Pull) | HTTP | HTTPS |
Strict (SSL-Only Origin Pull) | HTTPS | HTTPS |
完全に HTTPS 化するには
「Always Use HTTPS」の機能を使えば、クライアントーCloudflare間の通信に対して HTTP を HTTPS にリダイレクトできます。
ただし、SSL mode = Off と「Always Use HTTPS」は併用できません。
「Always Use HTTPS」を組み合わせた場合の結果は、以下のようになります。
SSL mode | Client --> Cloudflare | Cloudflare --> Origin |
---|---|---|
Off | HTTP | HTTP |
Off | HTTPS --> HTTP (301 Redirect) | - |
Flexible | HTTP --> HTTPS (301 Redirect) | - |
Flexible | HTTPS | HTTP |
Full | HTTP --> HTTPS (301 Redirect) | - |
Full | HTTPS | HTTPS |
Full (Strict) | HTTP --> HTTPS (301 Redirect) | - |
Full (Strict) | HTTPS | HTTPS |
Strict (SSL-Only Origin Pull) | HTTP --> HTTPS (301 Redirect) | - |
Strict (SSL-Only Origin Pull) | HTTPS | HTTPS |