メニュー
【SSL証明書】FAQ/情報

HSTS(HTTP Strict Transport Security)とは?設定方法と注意点

ページ更新日:2026/05/29

🔰 まずは結論
HSTS は、ブラウザに「このサイトには常に HTTPS で接続する」と記憶させ、SSLストリッピングなどの攻撃を防ぐ仕組みです。HTTPS が正しく動作しているサイトで、HTTPS レスポンスに次の1行を返すだけで有効になります。
Strict-Transport-Security: max-age=31536000; includeSubDomains
⚠ 証明書エラーがある状態で有効にするとサイトにアクセスできなくなるため、必ず HTTPS が正常に動作してから設定してください。まずは短い max-age でのテストを推奨します。

HSTS(HTTP Strict Transport Security)は、Webサーバーがブラウザに対して「このサイトには常にHTTPSで接続してください」と指示するセキュリティ機能です。
一度アクセスしたブラウザは、指定期間中は自動的にHTTPSでのみ接続するようになり、中間者攻撃(MITM)やSSLストリッピング攻撃を防止します。

HSTSの仕組み

HSTSは、サーバーがHTTPSレスポンスに以下のようなヘッダーを付与することで機能します:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
パラメータ 説明
max-age=31536000 ブラウザがHTTPS強制を記憶する期間(秒)。31536000秒=1年。
includeSubDomains サブドメインにも同じポリシーを適用する。
preload HSTSプリロードリストへの登録を許可。ブラウザ出荷時からHTTPSを強制。

HSTS は Chrome・Firefox・Safari・Edge など主要ブラウザがすべて対応しています(Internet Explorer 11 以降も対応)。

HSTSが有効になるまでの流れ

HSTSは「一度 HTTPS でアクセスしたブラウザのみ」に効力が及びます。初回アクセスがHTTPの場合は対象外です(プリロードリストに登録すれば初回から有効)。

  1. ユーザーが https://example.com に初めてアクセス
  2. サーバーが Strict-Transport-Security ヘッダーを返す
  3. ブラウザが「このドメインは max-age 秒間 HTTPS 必須」と記録
  4. 以降は http://example.com を入力してもブラウザ側で自動的に https:// に変換してリクエスト(サーバーへの HTTP リクエスト自体が発生しない)

HSTSのメリット

各Webサーバーでの設定方法

Nginx

server {
    listen 443 ssl;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    ...
}

Apache

# mod_headers モジュールが必要
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

IIS(web.config)

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

HSTSプリロードリストとは

Chrome・Firefox・Safari・Edgeなどの主要ブラウザは HSTSプリロードリスト(hstspreload.org)を持っており、リストに登録されたドメインには初回アクセスからHTTPSが強制されます。
登録するには以下の要件を満たす必要があります:

登録は hstspreload.org から申請できます。

段階的な導入手順(推奨)

HSTS は一度有効にすると簡単に解除できません。以下のステップで段階的に導入することを強く推奨します。

  1. HTTPS 環境を整備する:SSL証明書が正しくインストールされ、HTTP→HTTPS の301リダイレクトが動作していることを確認。
  2. 短い max-age でテストmax-age=300(5分)で設定し、ブラウザ・モバイル・SEOツールで問題がないか確認する。
  3. max-age を延長:問題なければ max-age=2592000(30日)→ max-age=31536000(1年)と段階的に延ばす。
  4. includeSubDomains を追加(任意):すべてのサブドメインが HTTPS に対応済みであることを確認してから追加。
  5. preload を追加してプリロード申請(任意):hstspreload.org で申請。一度登録すると削除に数ヶ月かかるため慎重に判断。

max-age の目安: テスト 300(5分)→ 初期運用 2592000(30日)→ 安定運用 31536000(1年)。プリロード申請には max-age=31536000(1年)以上が必須で、63072000(2年)以上が推奨されます。

HSTSの確認方法

curl でヘッダーを確認

curl -I https://www.example.com

レスポンスに Strict-Transport-Security: max-age=31536000; ... が含まれていれば正しく設定されています。

Chrome でブラウザキャッシュを確認・削除

Chrome のアドレスバーに chrome://net-internals/#hsts と入力すると、HSTS キャッシュの確認・削除ができます。
開発・テスト環境でHSTSをクリアしたい場合は「Delete domain security policies」欄にドメインを入力して削除してください。

HSTS・証明書チェーン・リダイレクト設定を自動診断
【ツール】SSL証明書インストールチェッカー(有効期限・HSTS・OCSP・HTTP/2・セキュリティスコア A+〜F を一括確認)

よくあるトラブルと対処

HSTS を設定したのに効かない

ローカル/開発環境で HTTPS にアクセスできなくなった

Chrome は chrome://net-internals/#hsts の「Delete domain security policies」で対象ドメインの HSTS を削除できます。サーバー側では Strict-Transport-Security: max-age=0 を返すことでブラウザの記憶を解除できます。

サブドメインにアクセスできなくなった

includeSubDomains を付けるとすべてのサブドメインが HTTPS 必須になります。証明書が未設定のサブドメインがある場合は、includeSubDomains を外すか、該当サブドメインにも証明書を用意してください。
混在コンテンツ(HTTPS ページ内の http:// リソース)でお困りの場合は 混在コンテンツ(Mixed Content)の対処 もご覧ください。

HSTSの注意点

📌 関連ページ:
NginxのHSTSとTLS設定強化(SSL Labs A+ 達成設定例)
ApacheでHSTS(常時SSL)設定
TLSバージョンと暗号スイートの設定ガイド
混在コンテンツ(Mixed Content)の対処
NginxへのSSL証明書インストール手順
ApacheへのSSL証明書インストール手順
常時SSL(Always On SSL)について