什么是 HSTS ?

借用维基百科的介绍,HTTP Strict Transport Security翻译为 HTTP 严格传输安全,网站部署该策略后,浏览器会强制启用 HTTPS , 以降低被劫持的风险.

日常中被攻击的场景?

  • 某些无节操的网络服务商会劫持购物网站,参与返利,甚至直接将返利网站的链接替换为自己的账号,形同强盗.
  • 某些网站明明没有展示广告,访客却一直反应有恶俗广告飘动.

有哪些类似技术?

大家为了解决中间人攻击,提出了各种方案:

  • HPKP(公钥钉扎),网站服务器提供一个包含证书公钥哈希的列表,浏览器在后续通信中仅信任列表中的证书.百度最近在强推此技术,罔顾中小网站尚未理解利弊的实际情况,ORZ.
  • Certificate Transparency(证书透明化),签发证书的 CA 将其签发的证书记录到可公开认证、只能附加内容且不可篡改的日志中.这个与前一种技术目标类似,而前景更好,推荐使用.

有什么缺陷?

可能很多同学都注意到:访客首次访问很可能是从 HTTP 重定向到 HTTPS 的,还可能被劫持.所以浏览器厂商直接内置了个 HSTS preload list ,列表中的域名首次访问就启用 HTTPS .另外需要注意关闭可能影响访客数月之久.

部署的前置条件?

  • 有个合法的证书,如果还没购买,不妨试试免费好用的Let’s Encrypt.
  • 将所有 HTTP 流量重定向到 HTTPS .
  • 所有子域名都要启用 HTTPS .
  • 网页服务器输出HSTS header,包含以下内容:max-age需要大于10886400秒,必须定义includeSubDomainspreload参数.
  • 如果使用额外的重定向,也应包含HSTS header.

部署可利用的工具?

  • 官方文档,RFC 6797.
  • SSL LABS 出品的 SSL 测试工具,可用来检查你的 SSL 设置情况和获取部署 HSTS 必须的公钥哈希.
  • 申请加入 HSTS preload list .需要等待较长时间.
  • 使用 Chrome 自带的chrome://net-internals/#hsts检查生效情况.

如何禁用 HSTS ?

最好别这么干,如果没想清楚,暂时就别启用.关闭很繁琐.具体参考文档.