サイトの常時SSLにHSTSを使用する方法

· 3 min read
サイトの常時SSLにHSTSを使用する方法


サイトを常時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 のオプション項目があります。

  1. includeSubDomains・・・ルールをすべてのサブドメインにも適用したい場合に設定します。
  2. 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)」という仕組みがあります。
こちらについての解説は以下に記載しておりますので、ご興味のある方はぜひ。

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

上部の入力ボックス内にプリロードするドメインを入力し、Enterを押下します。

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

設定に誤りがあると、この様にエラー画面になりますので、もう一度設定を確認します。

プリロードリストへの反映は時間がかかりますが
反映後はメジャーブラウザでHTTPSがデフォで通信しに来ます。

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

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

  1. 有効な証明書を持っている
  2. 同じホスト上のHTTPからHTTPSにリダイレクトしている
  3. すべてのサブドメインでHTTPS化している
  • そのサブドメインのDNSレコードが存在する場合は特に、WWWのサブドメインにHTTPSをサポートしている必要がある
  1. 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/