启用HSTS和申请HSTS Preload List

in Tutorials with 32 comments

HSTS是“HTTP Strict Transport Security”(HTTP严格安全传输)的缩写,开启了这项设置以后,主流浏览器会强制性地使用HTTPS来请求资源,能够更加有效地保护你网站和用户的数据安全。一般情况(未启用HSTS),浏览器会允许用户在了解了安全风险之后继续使用不安全的连接来访问,但如果启用了HSTS,则不允许这样做,所以你得有一定要长期使用HTTPS的打算,才能启动HSTS。

首先本站linpx.com加入了 Chrome 的 HSTS Preload List 了,在 chromium 的 transport_security_state_static.json 中可以查看

启用HSTS

HSTS 是一个响应头,格式如下:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload;

HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。


这里贴一个 Nginx 开启 HSTS 的简易教程

打开网站所对应的Nginx的conf配置文件

假设我的配置文件是在 /usr/local/nginx/conf/vhost 的目录

vim /usr/local/nginx/conf/vhost/www.linpx.com.conf

加入

server {
···
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

···

申请Preload List

HSTS 必须要在浏览器访问过你的网站一次以后才会生效,如果希望提前生效,需要申请 HSTS Preloading List。

目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:

觉得妥了就去 HSTS Preload List (hstspreload.appspot.com) 这个页面申请。

在唯一一个文本框输入你的网站即可,这个列表是人工审核,因此可能需要一段时间

3123123.png

已经成功加入HSTS网站是这样的效果

318752.png

特别提醒:对于 HSTS 以及 HSTS Preload List,如果你不能确保永远提供 HTTPS 服务,就不要启用。因为一旦 HSTS 生效,你再想把网站重定向为 HTTP,之前的老用户会被无限重定向,唯一的办法是换新域名。

大概就这样了,本篇文章是对上一篇文章(Nginx的SSL配置优化)的补充。

同时,因为已经看了很多遍QuQu的文章,很熟悉也很认同他说述的 所以本文比较多部分参考了:imququ.com/post/sth-about-switch-to-https.htm

Responses
  1. 之前申请过了。不过觉得太麻烦,现在又撤销了2333

    Reply
  2. 大明山上笑

    你好博主啊,请问你 我想带w和不带w的站点 都301到不带w的 https上
    这个规则要怎么写啊,我试了好几个都没通过https://hstspreload.appspot.com/ 的检测,
    说http不要带hsts标记,这明显就是没有检测到http转到https呀

    Reply
    1. @大明山上笑

      你这个蠢货。。。我不是在这下面评论了么,没通过的原因,你不看,你先来问问我啊。
      只要规则没写错,就行,不要开cdn ,直接a记录,原因就是检测不到你的80口

      Reply
    2. @大明山上笑

      你在你的站点的配置文件上再加一个server{} ,如下
      server {
      listen 80;
      server_name www.linpx.com;
      rewrite ^/(.*) https://$server_name/$1 permanent;
      }

      Reply
      1. 大明山上笑
        @Chakhsu Lau

        谢谢回复啊,我去试试 另
        if ($host = http://www.xxx.com) { return 301 $scheme://xxx.com$request_uri; }

        这样可以不。。我奇怪了换了好几个写法hsts都检测我错误。。。
        很想知道像博主你 的server里为何没有80 只有443
        我去 咋没有我头像。。

        Reply
        1. @大明山上笑

          有80 ,这段就是了,如果你有80的话 就去掉吧,不同的配置方式而已,都可以的。

          Reply
          1. 大明山上笑
            @Chakhsu

            呃 忘记说了,我本地转向是生效了,但是提交hsts 一直提示我http没有转向到https

            Reply
          2. 大明山上笑
            @Chakhsu

            呃 博主 其实我都试了。。还是不成功。。那个什么。你方便么?QQ上发你文件看看?谢谢

            我的QQ 5795516

            Reply
            1. @大明山上笑

              头像没显示出来是因为你没去 https://en.gravatar.com/ 设置

              Reply
            2. @大明山上笑

              你修改完还要重启一下nginx

              Reply
              1. 大明山上笑
                @Chakhsu

                当然重启了啊,一直改到现在都在郁闷,,,各种规则都试了基本
                建立两个server 一个80 一个443
                80的定义转向到443
                这思路错了吗 错了吗 错了吗。。。我都快抽抽了 哥们!/滑稽 。。。。

            3. @大明山上笑

              你确定是提醒http没有转向到https?

              Reply
              1. 禅猫
                @Chakhsu

                大兄弟。楼下那刷你评论的货是我朋友,,其实是我姨弟,在学习。抱歉

              2. 大明山上笑
                @Chakhsu

                搞定了 搞定了 ,博主咱们之前搞的都没错,正常来说 是这么配置的,但是还要根据当前自己的环境来写规则,第二个原因是该死的cdn
                。。。。

              3. 大明山上笑
                @Chakhsu

                不对不对,Warning: Unnecessary HSTS header over HTTP

                这个是说不要在Http上添加hsts标记,很明显还是指出Error: No redirect from HTTP 这个问题

              4. 大明山上笑
                @Chakhsu

                非常确定。。。不止说我没转到https 还提示我没有hsts标识。。我去了
                Error: No redirect from HTTP

                Warning: Unnecessary HSTS header over HTTP

                就这俩货。。我这郁闷半天了,
                在想这会不会是cdn的问题呢?但是都清空了呀

  3. 我又去检测了 这会又提示
    The HTTP page,这个hsts,关http什么鸟事啊 郁闷,我现在是做的301http到https 奇怪

    Reply
    1. @禅猫

      关于提示http页面不要带有hsts标记的问题,终于找到原因了,在于之前从http转向https 做的是301转向,80端口http协议还是暴露的所以会被检测到,解决办法 在server 里80端口那里做转向或者是用dns转向 到https 哎折腾一天就没注意到这个问题

      Reply
  4. 禅猫

    大兄弟。。我启用了http2 也加了HSTS响应头 可为啥检测还是提示我Warning: Unnecessary HSTS header over HTTP
    The HTTP page at http://chancat.photo sends an HSTS header. This has no effect over HTTP, and should be removed.

    Reply
    1. @禅猫

      给个链接看看

      Reply
      1. 禅猫
        @Chakhsu

        对了。。会不会是我把hsts写到location里的原因? 其实不知道为啥我的环境 有好多东西加在location里能用,放到server 却不行。。难道缓存问题?我开了Ngx cache purge模块。。
        环境为lnmp,debian7.3x64

        Reply
        1. @禅猫

          这,我就不清楚了

          Reply
          1. 禅猫
            @Chakhsu

            果然,我刚刚又改到server里了,去检测,提示我没有hsts的标识 666

            Reply
      2. 禅猫
        @Chakhsu

        额下面那段提示里有的呢
        chancat.photo
        另,发现你这个主题,在平板下点不动reply

        Reply
        1. @禅猫

          我待会看看,在做饭

          Reply
          1. 禅猫
            @Chakhsu

            嘿 ~这居家好男人 233

            Reply
  5. 我觉得这是多此一举啊,直接301重定向到https就好了

    Reply
    1. @园子大魔王

      301重定向的确能解决大部分问题,比如运营商劫持什么的;
      不过并不能抵抗恶意攻击。

      Reply
    2. @园子大魔王

      多次握手你高兴么?

      Reply
    3. @园子大魔王

      这个见人见智了,不过启用HSTS 可以很好的解决 HTTPS 降级攻击,而加入HSTS Preload List,可以避免首次 HTTP 请求被劫持。大概就这样。

      Reply
  6. HTTPS是未来。也是现在。

    Reply
    1. @土木坛子

      是的 :p

      Reply