HSTSとは何か、なぜ必要か
HSTS(Strict-Transport-Security レスポンスヘッダー)は、「このドメインには今後
必ずHTTPSでアクセスすること」をブラウザに覚えさせる仕組みです。
HTTPSへのリダイレクト(http:// へのアクセスを301/302で https:// に転送する設定)は
広く使われていますが、これだけでは最初の1回が保護されません。利用者が
http://example.com に直接アクセスした場合、リダイレクトが返るまでの間、その最初の
HTTPリクエストは平文で送信されます。この隙を突いて通信を横取りし、HTTPSへの
アップグレードを妨害してHTTPのまま通信を継続させる攻撃手法がSSLストリッピングです。
HSTSを一度受け取ったブラウザは、以後 max-age で指定した期間、そのドメインへの
アクセスをブラウザ内部で強制的に https:// に書き換えます。つまりHTTPリクエストが
そもそもネットワークに出て行かなくなるため、SSLストリッピングの隙をなくせます。
設定方法
前提条件
HSTSを有効にする前に、サイト全体(HSTSを適用する全パス、includeSubDomains を
使う場合は全サブドメイン)が問題なくHTTPSで応答できることを確認してください。
HSTSはブラウザにキャッシュされるため、有効化後にHTTP専用のコンテンツが見つかった
場合、max-age の期間が過ぎるまで是正が反映されません。
まずは短い max-age(例: 300秒〜1日程度)から始めて問題がないことを確認し、
段階的に6か月(15552000秒)・1年(31536000秒)へ延ばすことを推奨します。
nginxの設定例
HTTPSの server ブロックにのみ追加してください。HTTP側に追加しても、
HTTPS経由で送られない限りブラウザはヘッダーを無視します。
server {
listen 443 ssl;
server_name example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
always を付けることで、エラーレスポンス(4xx/5xx)でもヘッダーが付与されます。
また、nginxの add_header はより具体的なコンテキスト(location 等)で別の
add_header が定義されると、上位レベルの指定は継承されず無効になる点に注意してください。
location ブロックごとに add_header を使っている構成では、必要な location すべてに
HSTSの指定を追加する必要があります。
Cloudflareの設定例
ダッシュボードの SSL/TLS > Edge Certificates > HTTP Strict Transport Security (HSTS) から有効化します。
- Max Age Header:6か月(15768000秒)や12か月(31536000秒)などを選択
- Apply HSTS policy to subdomains:全サブドメインがHTTPS対応している場合のみON
- Preload:次項の注意点を確認してからONにしてください
includeSubDomainsとpreload:任意の強化オプション
HSTSには必須事項(ヘッダー自体の送信・十分な max-age)のほかに、任意の強化オプションが
2つあります。どちらも欠けていること自体は警告(warn)ではなく、あくまで追加の強化余地
として案内されるべき項目です。
- includeSubDomains:全サブドメインにもHSTSを適用します。一部のサブドメインが まだHTTP専用の場合、有効化するとそのサブドメインにアクセスできなくなります。
- preload:ブラウザベンダー(Chrome・Firefox・Safari等)が管理する「HSTS preload list」にドメインを登録し、利用者が一度もアクセスしたことがない状態からでも 最初からHTTPS接続を強制します。通常のHSTSは「一度HTTPSでアクセスした後」から 有効になるため、preloadはその最初の1回すら保護します。
preloadを有効にする前に:復旧が困難な副作用
preloadには他の設定と異なる重大な注意点があります。一度登録すると、削除を申請してから
実際に利用者のブラウザから消えるまでに数か月〜それ以上かかることです。登録期間中に
何らかの理由でHTTPS提供を取りやめる、または一時的にでも http:// のみに戻す必要が
生じた場合、対象ドメイン(および includeSubDomains の対象となる全サブドメイン)は
削除が反映されるまで利用者が一切アクセスできなくなります。
hstspreload.org への登録要件は次のとおりです。
max-ageが31536000(1年)以上であることincludeSubDomainsが付与されていること(全サブドメインがHTTPS対応済みであること)preloadディレクティブが付与されていること- ルートドメイン・
wwwサブドメイン(存在する場合)の両方がHTTPSで正しく応答すること
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
上記の副作用を理解し、明示的にpreloadを希望する場合のみ申請してください。 preloadなしでも、通常のHSTS(必須事項を満たしたもの)だけで基本的な保護効果は 得られます。
設定後の確認方法
curl -I https://<host> で Strict-Transport-Security ヘッダーが返ることを
確認したうえで、以下のフォームから再診断してください。診断結果では、HSTSの
有無・max-age の十分性・includeSubDomains・preloadの状況をまとめて確認できます。
まとめ
- HSTSは、HTTPSリダイレクト設定だけでは防げない「最初の1回」のリスクを減らします。
- 必須事項(ヘッダーの送信・十分な
max-age)と、任意の強化オプション (includeSubDomains・preload)は分けて考えてください。 - preloadは復旧が困難な副作用があるため、内容を理解したうえで希望する場合のみ 有効にしてください。
証明書自体の有効期限管理についてはSSL証明書の有効期限を確認する方法 もあわせてご確認ください。診断結果の取り扱いについては免責事項も ご覧ください。