HTTPからHTTPSへのリダイレクトを設定していても、HSTS(Strict-Transport-Security)ヘッダーを返していなければ、外部の診断では「HSTS未設定」と判定されます。リダイレクトとHSTSは別の仕組みで、ApacheならHTTPS側のVirtualHostに1行追加するだけで解消します。
まず自分のサイトがヘッダーを返しているか確認する
診断ツールはレスポンスヘッダーを見ているだけなので、同じ方法で確認できます。curlでHTTPSのページを取得し、Strict-Transport-Securityの行があるかを見ます。
curl -sI https://www.example.com/mypage/login.php | grep -i strict
何も出力されなければ未設定です。HTTP側にリダイレクトがあるかどうかは、この判定に関係ありません。実際に、サイト全体をHTTPS化してリダイレクトも設定済みのサイトで、外部から「ログイン画面がHSTS未設定」と指摘を受けたことがあります。確認すると、リダイレクトは正常に動いていて、ヘッダーだけが無い状態でした。
リダイレクトがあってもHSTSが必要な理由
リダイレクトは、利用者が http:// でアクセスした後にサーバーが「HTTPSへ移動せよ」と返す仕組みなので、最初の1回はHTTPで通信が発生します。診断で指摘されているのはこの1回です。
HSTSは、HTTPSで一度アクセスしたブラウザに「このサイトには今後max-age秒の間、必ずHTTPSで接続せよ」と記憶させるヘッダーです。記憶したブラウザは、利用者が http:// を入力してもサーバーに送る前に自分でHTTPSへ書き換えるため、HTTP通信そのものが発生しなくなります。
役割が違うので、どちらか一方では足りません。リダイレクトは初回訪問用、HSTSは2回目以降用です。
Apacheに追加する設定
headersモジュールが有効になっているかを先に確認します。
apache2ctl -M | grep headers
headers_module が表示されなければ a2enmod headers で有効化します。次に、HTTPS(443番)側のVirtualHostに次の1行を追加します。
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
...
Header always set Strict-Transport-Security "max-age=31536000"
</VirtualHost>
ブラウザはHTTPで受け取ったHSTSヘッダーを無視するので、80番側のVirtualHostに書いても意味がありません。HTTPS側に書きます。追加したら設定を検証してから反映します。
apache2ctl configtest
systemctl reload apache2
反映後にもう一度curlで確認し、次の行が返れば完了です。
Strict-Transport-Security: max-age=31536000
max-ageの31536000は1年です。HTTPS化済みでリダイレクトも動いているサイトなら、最初から1年で問題ありません。
includeSubDomainsとpreloadは付ける前に確認する
HSTSのオプションには includeSubDomains と preload がありますが、診断の指摘を解消するだけなら不要です。
includeSubDomains を付けると、ステージング環境や管理用のサブドメインも含めて全部がHTTPS必須になります。サブドメイン側の証明書が切れると、そのサブドメインにアクセスできなくなります。ステージング環境をサブドメインで運用しているなら付けない方が安全です。
preload は、ブラウザに同梱されるHSTSサイト一覧へ登録するための宣言で、登録すると取り消しに時間がかかります。指摘への対応で付けるものではなく、運用が固まってから検討します。