ウェブマスターがウェブのことを書いたら

ウェブマスターとして働いている管理人がウェブで躓いたこと、ググったことを備忘録として書いています。主に技術的なこと、WEBサイト設計のこと

常時SSL化(https)するときのHSTS設定の方法と注意点

   

 - サイト設計

サイトを常時SSL化、https化する場合のHSTS設定についての方法と注意点をまとめます。

常時SSL化する場合は、サーバー側でHSTS(HTTP Strict Transport Security)という設定をすることでセキュリティを高めることができます。

以前の新規サイト公開時に初期設定したい.htaccessの書き方の記事でも書きましたが、
簡単に説明すると、
SSL化したとしてもhttpでアクセスされる場合があり、セキュリティ上では万全ではない(通信を傍受されたりフィッシング詐欺に遭ったりする危険性がある)ようです。それを防ぐ仕組みとしてサーバー側でHTTPSで必ず接続するようにとブラウザに指示するのが、HSTSの設定です。

この設定をすると、そのサイトに対してアクセスするのにHTTPを使わず自動的にHTTPSで接続するようにできます。

HSTSの設定方法

HSTSの設定方法は.htaccessに以下の内容を記述します。

Header set Strict-Transport-Security "max-age=31536000"

max-ageは有効期間です。単位は秒で、86,400秒は1日です。
31,536,000は1年間を設定しています。

そのほか、includeSubDomains、preload のオプション項目があります。

includeSubDomains・・・ルールをすべてのサブドメインにも適用したい場合に設定します。
preload・・・プリロードさせたい場合に設定します。(内容は後述しています)

参考:HTTP Strict Transport Security – Web セキュリティ | MDN

以上です。

ここでさらに詳細を説明すると

HSTSの設定は2回目以降のアクセスについてHTTPのURLをブラウザに打ち込んでも、HTTPSでアクセスさせる仕組みです。

しかし、初回のアクセスについては、HTTPでアクセスすることがあり得るので、セキュリティは万全とはいえない状態です。(万全とはいえないケースについてはこちら

プリロードHSTS

そのため、HSTSをさらに確実にするために「プリロードHSTS(Preload HSTS)」という仕組みがあります。

これは、プリロードHSTSに対応しているブラウザ(Firefox、Chrome、Safari)に、このドメインはHSTSを設定しているということを事前に知らせておくことができるので、初めてアクセスするときからHTTPを使わずHTTPSで接続できるようになります。

詳しくは先ほどの参考ページのStrict Transport Security のプリロードの箇所に書かれています。

その中でGoogleでは、ドメインをHSTS Pre-loaded Listに登録するサービスを行っています。
HSTS Preload Submission

ここからドメインを登録すれば、各対応ブラウザにも反映されます。その際に先ほどのHSTSの設定方法(.htaccess)にオプションの設定を記述する必要があります。

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

プリロードリストに登録するときの注意点

ここで重要なのが、プリロードリストに登録するときに条件が書かれています。

  1. Have a valid certificate.
  2. Redirect from HTTP to HTTPS on the same host.
  3. Serve all subdomains over HTTPS.
    • In particular, you must support HTTPS for the www subdomain if a DNS record for that subdomain exists.
  4. Serve an HSTS header on the base domain for HTTPS requests:
    • The max-age must be at least eighteen weeks (10886400 seconds).
    • The includeSubDomains directive must be specified.
    • The preload directive must be specified.
    • If you are serving an additional redirect from your HTTPS site, that redirect must still have the HSTS header (rather than the page it redirects to).

翻訳してみると・・・(すいませんだいたいです。。)

  1. 有効な証明書を持っている
  2. 同じホスト上のHTTPからHTTPSにリダイレクトしている
  3. すべてのサブドメインでHTTPS化している
    • そのサブドメインのDNSレコードが存在する場合は特に、WWWのサブドメインにHTTPSをサポートしている必要があります。
  4. HTTPSリクエストのために以下のHSTSヘッダを送信している
    • max-ageが少なくとも18週間(10886400秒)でなければなりません。
    • includeSubDomainsを指定する必要があります。
    • preloadを指定する必要があります。
    • あなたがHTTPSサイトから追加のリダイレクトを提供している場合は、そのリダイレクトはまだHSTSヘッダ(というよりもページそれがリダイレクトを)持っている必要があります。

上記を満たしている必要があります。その中でも2、3が要注意です。

2については、
ドメインの中ですべてのページがhttps化されている必要があります。一部のページがhttpで表示されている場合、ブラウザ側で強制的にhttpsで表示されることになり、エラーとなります。

3については、
ルートドメインだけでなく、すべてのサブドメインもhttps化されている必要があります。サブドメインでもサイトを運用している場合、サブドメインでもhttps化が必要です。httsで運用されている場合、ブラウザ側で強制的にhttpsで表示されることになり、エラーとなります。

1、4については登録時にエラー表示されますので設定して対応できます。2、3についてはこれらを踏まえて登録しないとページが表示されない状態に陥る可能性があります。

そうなった場合、各ブラウザのキャッシュを削除しないと表示されない状態となるため注意が必要です。(私もサブドメインが表示されなくなり困りました。)

プリロードHSTSまとめ

プリロードHSTSは上記の条件を満たした場合にのみ、適用できるものなので複雑なサイト構成になっている場合や、今後の展開が想定できる状態でないと運用上危険なポイントもあります。

間違って設定してしまって、プリロードリスト削除と検索して困っている私のような方もいました。個人的にはhttpからhttpsへのリダイレクト設定を最低限していれば、現時点でHSTSをするまでの必要性はないのでは、とも思いました。

自己責任で設定しましょう。

その他参考となったページ

ありがとうございます。

「この記事が参考になった」場合はクリックをお願いします。