サイトを常時 SSL 化する場合、リダイレクトによる設定が一般的ですが、
サーバー側で HSTS(HTTP Strict Transport Security)という設定をすることで
セキュリティを高めることができます。
今回は HSTS の設定方法と、その注意点についてまとめます。
HTTP Strict Transport Security (エイチティーティーピー・ストリクト・トランスポート・セキュリティ、略称 HSTS)とは、WebサーバーがWebブラウザに対して、現在接続しているドメイン(サブドメインを含む場合もある)に対するアクセスにおいて、次回以降HTTPの代わりにHTTPSを使うように伝達するセキュリティ機構である。RFC 6797 で規定されている。HTTP Strict Transport Security – Wikipedia
簡単に説明すると、
SSL 化したとしても http でアクセスされる場合があり、
セキュリティ上では万全ではない(通信を傍受されたり
フィッシング詐欺に遭ったりする危険性がある)ようです。
それを防ぐ仕組みとしてサーバー側で
HTTPS で必ず接続するようにとブラウザに指示するのが、HSTS の設定です。
HSTS の設定方法
HSTS の設定方法は .htaccess に以下の内容を記述します。
header set Strict-Transport-Security "max-age=31536000"
なお、nginx の場合は以下の通り。
server{
listen 443;
ssl on;
...
add_header Strict-Transport-Security "max-age=31536000"; # 追加
}
max-age は有効期間です。単位は秒で、86,400 秒は 1 日です。
31,536,000 は 1 年間を設定しています。
そのほか、includeSubDomains、preload のオプション項目があります。
- includeSubDomains・・・ルールをすべてのサブドメインにも適用したい場合に設定します。
- preload・・・プリロードさせたい場合に設定します。(内容は後述しています)
設定反映後、ブラウザで実際にアクセスして
レスポンスヘッダに HSTS の項目が設定されていることが確認できます。
# curl --head http://18.183.225.54
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 03 May 2017 06:16:45 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.24
Link: <http://18.183.225.54/?rest_route=/>; rel="https://api.w.org/"
#Strict-Transport-Security: max-age=31536000;
参考:
HTTP Strict Transport Security – Web セキュリティ | MDN
以上です。
おまけ
HSTS をさらに確実にするために
「プリロード HSTS(Preload HSTS)」という仕組みがあります。
こちらについての解説は以下に記載しておりますので、ご興味のある方はぜひ。
<!--more-->
HSTS の設定は 2 回目以降のアクセスについて、
HTTP の URL をブラウザに打ち込んでも HTTPS でアクセスさせる仕組みです。
しかし、初回のアクセスについては
HTTP でアクセスすることがあり得るので、セキュリティは万全とはいえない状態です。
そのため、HSTS をさらに確実にするために
「プリロード HSTS(Preload HSTS)」という仕組みがあります。
これは、プリロード HSTS に対応しているブラウザ(Firefox、Chrome、Safari)に
「このドメインは HSTS を設定している」ということを事前に知らせておくことができるので、
初めてアクセスするときから HTTP を使わず HTTPS で接続できるようになります。
設定方法
上で記載した HSTS の設定に、includeSubDomains と preload を追加してやります。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
これでサーバ側の設定は完了です。
ドメインをプリロードリストに登録する
Google では、ドメインを HSTS Pre-loaded List に登録するサービスを行っています。
ここからドメインを登録すれば、各対応ブラウザにも反映されます。

HSTS Preload Submission
https://hstspreload.appspot.com/
上部の入力ボックス内にプリロードするドメインを入力し、Enter を押下します。

成功すればこの様な画面になりますので、Submit の 2 箇所のチェックボックス
(お前はドメインサイトの所有者か、サブドメインも HTTPS 化してるか)
にチェックを入れ Enter を押下します。

設定に誤りがあると、この様にエラー画面になりますので、もう一度設定を確認します。
プリロードリストへの反映は時間がかかりますが、
反映後はメジャーブラウザで HTTPS がデフォで通信しに来ます。
プリロードリストに登録するときの注意点
ここで重要なのが、プリロードリストに登録するときに条件が書かれている点です。
- 有効な証明書を持っている
- 同じホスト上の HTTP から HTTPS にリダイレクトしている
- すべてのサブドメインで HTTPS 化している
- そのサブドメインの DNS レコードが存在する場合は特に、
wwwのサブドメインに HTTPS をサポートしている必要がある
- そのサブドメインの DNS レコードが存在する場合は特に、
- HTTPS リクエストのために以下の HSTS ヘッダを送信している
max-ageが少なくとも 18 週間(10886400 秒)でなければいけないincludeSubDomainsを指定する必要があるpreloadを指定する必要がある- HTTPS サイトから追加のリダイレクトを提供している場合は、そのリダイレクトも HSTS ヘッダを持っている必要がある
上記を満たしている必要があります。
結構たいへんですね。
プリロード HSTS まとめ
プリロード HSTS は上記の条件を満たした場合にのみ適用できるものなので、
通常のリダイレクト処理で HTTPS 化したほうが無難そうです。。
もしサイトのセキュリティを高めたいという方は、ぜひご一考ください。
※参考サイト
https://www.note.technology/note/201604111454
http://tuono034s.com/web-entry/2310/