ポートベースVirtualhostでHSTSを有効にすると全てのVirtualhostへの通信がhttpsにリダイレクトされてしまう

SSL photo
Photo by jeff_golden

ownCloudを8.1にアップグレードすると,

The “Strict-Transport-Security” HTTP header is not configured to least “15768000” seconds. For enhanced security we recommend enabling HSTS as described in our security tips.

というWarningが出ます.ownCloudのマニュアルには下記のコードをVirtualHostに記述するように記載があります.

Header always add Strict-Transport-Security "max-age=15768000"

これはHSTS(HTTP Strict Transport Security)と呼ばれ,httpで通信された際に,サーバがブラウザにhttpsに変更するように伝える仕組みだそうです.最初の一回はhttpで通信されたとしても,2回目以降の通信は強制的にhttpsに変更され,ブラウザはHSTSが有効になっているサイトとして記憶します1 .SSLで通信するに越したことはないので,さっそく上記設定を有効にしたところ,ポートベースVirtualHostで運用している他のサイトもhttpsにリダイレクトされるようになってしまいました.

他にもいろいろ修正した箇所があったため,当初はどこに問題があるか分からず,試行錯誤を繰り返したのちに,参考サイト:http のリクエストが勝手に https にリダイレクトされるときは Strict-Transport-Security を疑おう のおかげでHSTSが原因であることに気づきました.調べたところ,HSTSを有効にすると,対象ドメインの全てのポートにおけるhttpリクエストに対して,httpsへのリダイレクトを強制する 2 そうです.したがって,ポートベースのVirtualHostを運用している場合3 は,全てのVirtualHostがhttpsにリダイレクトされてしまいます4

全てのサイトをSSLで運用してる場合は良いかもしれませんが,そうでない場合にはこれは困ります.自分の場合は,そもそもhttp80番で通信できるようにはしておらず(http用のポートを開けていないのでhttpでアクセスするとBad Requestとなる),違うポートで別のサイトを運用しているため,HSTSの設定は外しました.マニュアルに書かれていることを鵜呑みにして,きちんと内容を理解していないと,思わぬ落とし穴にハマりますね・・・

  1.  各ブラウザのHSTSレコードを削除する方法: How to clear HSTS Settings in Major Browsers | that’s so … classically.me  []
  2. 参照:https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14  []
  3. 名前ベースのVirtualHostにおいて,HSTSは別ドメインに対して自動的には有効にならない模様 []
  4. もしかしたら回避策があるかもしれませんが,見つけられていません []