开启 Nginx HSTS 来直接强制跳转 HTTPS

前言

今天发现又拍云提供了一个 HTTPS安全检测工具,看到如果增加 HSTS 参数,可以让评级升级,果断了解一波。

HSTS

HSTS 是一种安全机制,主流网站 HTTP -> HTTPS 的方式都是返回 301 重定向到 HTTPS 地址,但是这样会多一次连接跳转,这样第一次请求的 HTTP 连接存在被会话劫持的风险,而且这样也会拉长网站的响应时间,而采用 HSTS 策略的网站会保证浏览器始终连接到该网站的 HTTPS 加密版本,不需要用户手动在 URL 地址栏中输入加密地址,减少一次请求,加快响应。

为了避免 HSTS 生效前的首次 HTTP 请求被劫持,保证安全性浏览器厂商们提出了 HSTS Preload List 方案:内置一份定期更新的 HSTS 域名列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。
可以在此查看已经加入的列表:https://hstspreload.org/

Nginx 添加 HSTS 的支持

支持 HSTS 也很简单,只需要在返回头中增加 Strict-Transport-Security 字段即可,并且建议拉长缓存时间,又拍云的建议是填写半年以上,我这里直接填写的一年,然后其中 includeSubDomains 会将该域名下的所有子域名也同时开启 HSTS,如果不需要可以不加。最终如下所示:

server {
......
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
......
}

重启 Nginx,再运行又拍云的 HTTPS 检测,完美搞定,over。

将自己的域名加到 HSTS Preload List 名单中

如果你也想将自己的域名加入到浏览器厂商的白名单中,首先要满足以下几点:

  1. 有效的 SSL/TLS 证书
  2. 重定向所有的 HTTP 流量到 HTTPS
  3. 必须声明 includeSubdomains,全部子域名的流量均通过 HTTPS
  4. 在相应的域名中输出 HSTS 响应头
  5. HSTS 过期时间至少大于 18 周(10886400 秒)
  6. 必须声明 preload

然后在 https://hstspreload.org/ 中提交自己的域名,如果以上要求全部通过,静待几天到几个周不等之后就可以看到自己的域名已经加入到 HSTS Preload List 中了。

Last modification:December 21st, 2018 at 02:38 pm
If you think my article is useful to you, please feel free to appreciate

6 comments

  1. Saintw

    includeSubDomains 字段会把所有子域都开启 HSTS,博主应该写一下

    1. feeeei
      @Saintw

      呃... 感谢感谢,写的时候疏忽了

  2. 车店长

    安全吗?

    1. feeeei
      @车店长

      安全的,业界主流解决方案

  3. 采果子

    这个已经设置了,很好用

  4. 学习笔记Blog

    其实如果使用 CDN 的话,服务器上没有这个也可以的! CDN 一般都会要求设定的!

Leave a Comment