在想一个问题: HSTS 为什么有意义? - V2EX
lslqtz
V2EX    SSL

在想一个问题: HSTS 为什么有意义?

  •  
  •   lslqtz 2017-01-26 10:04:39 +08:00 via iPhone 7645 次点击
    这是一个创建于 3187 天前的主题,其中的信息可能已经有所发展或是发生改变。
    不谈预置列表,就谈强制 HTTPS ,如果只是首页要强制 HTTPS ,那么 301 我记得是缓存 100 年的。
    如果是第一次请求就被中间人的情况 HSTS 也没用啊...,而且HSTS开启子域名后有一些没配证书的就会挂掉。
    而且HSTS这种做法还会有一些兼容性问题,似乎也只在HTTPS下访问才会生效。
    第 1 条附言    2017-01-26 11:45:15 +08:00
    个人感觉的总结如下:
    1 、 301+过期时间配合 HPKP 比 preload 更灵活(子域名自由选择是否配置证书,过期时间灵活,在 HTTP 至 HTTPS 迁移方面有优势。 preload 更安全,但是反悔的话...)。
    2 、在遇上仅首页要做重定向的情况下, HSTS 显得有点“没必要”(重复并且不支持老式浏览器。
    3 、通配符大法好!
    52 条回复    2020-01-18 14:56:41 +08:00
    lhbc
        1
    lhbc  
       2017-01-26 10:19:49 +08:00   2
    1. preload 有效防止中间人
    2. includeSubDomains 可以传染到所有子域
    3. 中间人如果使用了无效证书,浏览器会拒绝例外证书
    4. 301 默认不会缓存很久,通过头部让浏览器缓存指定时间
    lslqtz
        2
    lslqtz  
    OP
       2017-01-26 10:23:05 +08:00 via iPhone
    @lhbc 不谈 preload (不谈预置列表)和子域(只是首页)了啊...
    4 的话 301 网上看默认 100 年
    3 是个好理由 发个感谢
    kindjeff
        3
    kindjeff  
       2017-01-26 10:23:05 +08:00 via iPhone
    所以需要预置列表
    ryd994
        4
    ryd994  
       2017-01-26 10:26:36 +08:00 via Android
    hsts 的所谓兼容性问题,恰恰是普通 https 中常见的弱点。
    比如混合内容,这就是错误的处理,没 hsts 的时候有人凑合用而已
    hsts 是对 https 的常见实现错误的修正,毕竟事实证明 https 当初的很多设计在理论上是安全的,可实际上没能做到
    davidyin
        5
    davidyin  
       2017-01-26 10:28:26 +08:00
    HSTS 的重要性就在于预置列表。
    lhbc
        6
    lhbc  
       2017-01-26 10:37:37 +08:00   1
    @lslqtz 301 大多数浏览器在重启后没有缓存。可以用 Cache-Control 指定缓存时间
    ZE3kr
        7
    ZE3kr  
       2017-01-26 10:37:48 +08:00 via iPhone   2
    L3 已经说了一些了。还有就是 301 ,他只能重定向一个页面,如果是一个域名下的所有页面( Path )呢?假如有人就是根据某一个域名钓鱼,它可以定义一个你之前绝对没访问过的 Path ,那假如开了 HSTS 并之前访问过,肯定好比 301 好。

    事实情况是,首页 301 之后,浏览器不知道所有页面都是 301 ,所以有 HSTS
    ZE3kr
        8
    ZE3kr  
       2017-01-26 10:41:18 +08:00 via iPhone
    HSTS 必须在 HTTPS 下才能生效啦,假如没 HTTPS 和 HTTPS 证书,也弄了 HSTS ,或者中间人加了这个 Header ,岂不是就再也无法忘问了?

    还有不会有人会在实际部署时没配好证书就 includeSubDomains 的
    VmuTargh
        9
    VmuTargh  
       2017-01-26 11:19:17 +08:00   1
    @lhbc 第三点不是 HPKP/DANE 的事情么(
    kn007
        10
    kn007  
       2017-01-26 11:32:13 +08:00
    最主要是 1L 说的中间人如果使用了无效证书,浏览器会拒绝例外证书。而不会询问你是否继续,既然不安全,为何继续。
    kn007
        11
    kn007  
       2017-01-26 11:33:09 +08:00
    补充:当然必须 preload
    kn007
        12
    kn00  
       2017-01-26 11:33:41 +08:00
    另外 301 可以被劫持,并不安全。
    lslqtz
        13
    lslqtz  
    OP
       2017-01-26 11:35:44 +08:00 via iPhone
    @kn007 在第一次建连时, HSTS 同样可以被劫持。
    第二次建连时,两个都可以被缓存。
    kn007
        14
    kn007  
       2017-01-26 11:36:51 +08:00
    @lslqtz 所以我下面补充了, preload 是必须的。
    kn007
        15
    kn007  
       2017-01-26 11:37:57 +08:00   1
    @lslqtz 找了下,可以下屈哥写的文章。
    https://imququ.com/post/sth-about-switch-to-https.html#toc-2

    其中提到:
    可以看到 HSTS 可以很好的解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。
    lslqtz
        16
    lslqtz  
    OP
       2017-01-26 11:38:48 +08:00 via iPhone
    @ryd994 HSTS 也是允许混合内容的吧...
    如果不要子域名, 301 感觉重新在加一个 HSTS 没啥必要。
    @lhbc 已发感谢。
    @VmuTargh HPKP +1
    @kn007 感觉 preload 不太灵活...301 可以灵活的设置过期时间,配合 HPKP 。
    lslqtz
        17
    lslqtz  
    OP
       2017-01-26 11:39:41 +08:00 via iPhone
    @kn007 哈哈,这篇文章我也看过。
    经常逛屈屈的博客。
    kn007
        18
    kn007  
       2017-01-26 11:42:47 +08:00
    @lslqtz 嗯,我一开始也是你这种想法,但配合泛域名证书就无所谓灵活不灵活了。。。有了 http2 ,我想不出为什么要回到 http

    前几天 V2 有位 BuySSL 的赞助了份泛域名。
    lslqtz
        19
    lslqtz  
    OP
       2017-01-26 11:43:56 +08:00 via iPhone
    @kn007 可我没有啊噗噗=A=
    kn007
        20
    kn007  
       2017-01-26 11:45:55 +08:00
    @lslqtz 哈哈哈哈。因为有了 preload 和 hsts ,我就没上 HPKP ,无所谓了。懒得维护。
    lslqtz
        21
    lslqtz  
    OP
       2017-01-26 11:47:10 +08:00 via iPhone
    @kn007 以后下一个买同样域名的时候就被我们坑死了(内心 OS :为什么明明正常客户打不开 hhhh )
    lslqtz
        22
    lslqtz  
    OP
       2017-01-26 11:48:38 +08:00 via iPhone
    突然发现 AppEnd 少了个括号...
    kn007
        23
    kn007  
       2017-01-26 11:50:57 +08:00
    @lslqtz 哈哈,那是不可能的,我是不会让出去的,嗯嗯嗯~
    lhbc
        24
    lhbc  
       2017-01-26 11:57:18 +08:00
    @VmuTargh
    @lslqtz
    HPKP 需要团队维护,如果缺少实践及长期规划,可能会造成严重的生产事故
    相反, HSTS 就简单些,只要求证书有效
    lslqtz
        25
    lslqtz  
    OP
       2017-01-26 11:58:54 +08:00 via iPhone
    @lhbc Let's Encrypt 自动续期,以及把 LE 的根 /中级加入 HPKP 名单即可~
    lhbc
        26
    lhbc  
       2017-01-26 12:05:59 +08:00
    @lslqtz 还有那种证书被 CA 意外 /正常吊销的情况啊
    对于小公司, HPKP 还是比较麻烦,可能平时连工作流程 /文档都没有,怎么去管理 HPKP ?
    kn007
        27
    kn007  
       2017-01-26 12:23:19 +08:00
    @lhbc 这确实是个问题。+1

    但是这个无所谓小公司的问题,主要还是运维的能力问题。还有个人处理能力的问题。
    lslqtz
        28
    lslqtz  
    OP
       2017-01-26 12:57:40 +08:00 via iPhone
    @lhbc HPKP 可以设置多个 CA 做备用~
    但是小公司 HSTS 都不知道怎么用...
    VmuTargh
        29
    VmuTargh  
       2017-01-26 13:16:35 +08:00
    @lhbc HPKP/DANE 只能够保证这个 CA 是你要的信任 CA ,如果是吊销的情况得靠 OCSP-Stapling&OCSP-Must-Staple 或者 Certificate Transparency
    VmuTargh
        30
    VmuTargh  
       2017-01-26 13:18:10 +08:00
    啊更正一下, DANE 是 per Cert 而不是 per CA
    lslqtz
        31
    lslqtz  
    OP
       2017-01-26 13:20:39 +08:00 via iPhone
    @VmuTargh 他的意思是开了 HPKP 证书误吊销无法换~
    ZE3kr
        32
    ZE3kr  
       2017-01-26 13:32:46 +08:00
    我怎么觉得 HPKP 一点也不灵活,换 CA 都麻烦。 DANE 稍微灵活一点,但兼容性不如 HPKP 。 HPKP 兼容性不如 HSTS 。 preload 比较坑的就是必须要启用子域名,但是大不了不加 preload 和子域名不是还照样用么。

    还有**HPKP 和 HSTS 是两个不同的东西**。 HSTS 是必须配合 301 , HPKP 可以不配合 301 。不知道 lz 为什么说 HSTS 重复?只不过是多了一个 header 而已。

    所以,如果是全站 HTTPS ,既然开了 301 就一定要一起开 HSTS (可以不加子域名,而且 HSTS 也是可以配置灵活的有效期啊),没有副作用。 HPKP 没必要开(哪家 CA 敢乱发证书?)

    HSTS 还有一个好处,就是证书不是有效 CA 的话,直接无法访问,不去问“是否信任”之类的,正如 L10 和 L1 说的。而 HPKP 直接绑定在一家或几家 CA ,不灵活。

    HPKP 兼容性: http://caniuse.com/#feat=publickeypinning
    HSTS 兼容性: http://caniuse.com/#feat=stricttransportsecurity
    DANE 兼容性:约为 0

    很明显 HSTS 兼容性好

    @VmuTargh DANE 是可以对 CA 或中间证书配置的,相比 HPKP 多了 Per Cert
    ZE3kr
        33
    ZE3kr  
       2017-01-26 13:37:09 +08:00
    @ryd994 混合内容正确处理方法(不推荐): Content- Security-Policy: upgrade-insecure-requests

    这是真正的消除混合内容的方法,**包括外部链接在内**。
    VmuTargh
        34
    VmuTargh  
       2017-01-26 13:39:23 +08:00
    @ZE3kr HPKP 同样可以 per Cert ,但是实际部署的时候都是拿中间证书来搞。另外 HPKP 我的 ttl 是设置到很低的,避免换 CA 签发证书的时候爆炸(我就被坑过一次)
    @lslqtz 低 ttl 设定即可(另外不设定备用 CA 怪我咯
    lslqtz
        35
    lslqtz  
    OP
       2017-01-26 13:50:13 +08:00 via iPhone
    @VmuTargh 我知道可以啊 是回复他的...
    @ZE3kr 我们已经在用了,主机壳的页面 HTTPS 后插入的图片改链接失败了,所以就...
    lslqtz
        36
    lslqtz  
    OP
       2017-01-26 13:52:39 +08:00 via iPhone
    @ZE3kr 但对于老式浏览器 额外 HSTS 就没必要了
    HPKP 也不一定必要和支持,但是有人提到无法取消告警,就提了提。
    lslqtz
        37
    lslqtz  
    OP
       2017-01-26 13:54:08 +08:00 via iPhone
    @ZE3kr 我的意思就是:在功能重复的情况下,尽量精简
    otakustay
        38
    otakustay  
       2017-01-26 15:39:55 +08:00
    因为非 HTTPS 的 301 能被劫持,所以面对有针对性的钓鱼的话,没有 HSTS 的 HTTPS 跟没有一样,劫持下初始的 301 跳掉就行了,整个 HTTPS 就绕开了
    lslqtz
        39
    lslqtz  
    OP
       2017-01-26 18:06:06 +08:00 via iPhone
    @otakustay 首次访问 HSTS 也能被劫持。
    301 和 HSTS 第二次访问都会使用缓存
    otakustay
        40
    otakustay  
       2017-01-26 20:34:13 +08:00
    @lslqtz 所以有 hsts preload list 这东西啊, 301 能靠 preload 不被劫持么
    lslqtz
        41
    lslqtz  
    OP
       2017-01-26 22:03:43 +08:00
    @otakustay 不是说不谈那个了么。。。
    valkjsaaa
        42
    valkjsaaa  
       2017-01-27 03:56:26 +08:00
    我怀疑 HSTS 有一个作用是如果你的子域名被劫持了,实际上还是可以盗取 Cookie 的,所以想要安全,最好全站 HSTS 。这个 301 就搞不定了吧?
    lslqtz
        43
    lslqtz  
    OP
       2017-01-27 05:32:18 +08:00 via iPhone
    @valkjsaaa Cookie 不一定是泛域的,子域名的确是需要 HSTS ,但是实际上除了裸域和 www ,对大部分人来说子域的需求不是那么大。
    msg7086
        44
    msg7086  
       2017-01-29 13:55:44 +08:00   1
    考虑用 307 而不是 301 。
    HPKP 必须包含一个备用密钥,否则 HPKP 直接不生效。
    HSTS 就是在安全性和灵活性之间选择了安全性,而你说的跳转大法则是相反,在安全性和灵活性之间选择了灵活性。
    这些东西就是些 trade off 而已,根据需要来选择就好了。
    你问有没有意义,当然是有的,而且和你关系不大,因为你不需要这个级别的安全性,所以感受不到其意义。
    lslqtz
        45
    lslqtz  
    OP
       2017-01-30 03:52:03 +08:00 via iPhone
    @msg7086 我感觉如果只是在裸域的话, HPKP+301 能兼顾灵活+安全
    msg7086
        46
    msg7086  
       2017-01-31 01:37:36 +08:00
    @lslqtz HPKP 和 HSTS 要解决的问题是不太一样的。
    比如你打开 HPKP 以后,我仍然可以在任何一个公共 Wifi 上劫持你的 301 请求。
    lslqtz
        47
    lslqtz  
    OP
       2017-01-31 08:55:18 +08:00 via iPhone
    @msg7086 缓存了就无法劫持了...
    第一次都能被劫持
    msg7086
        48
    msg7086  
       2017-02-01 10:27:35 +08:00
    @lslqtz 301 缓存和 HSTS 缓存还不太一样。 301 的缓存应该很容易被清除……
    Williamp
        49
    Williamp  
       2017-03-07 14:58:17 +08:00
    HSTS stands for HTTP Strict Transport Security which helps to stop HTTP downgrade attacks while transferring user's data from http to https.
    lslqtz
        50
    lslqtz  
    OP
       2017-03-08 18:32:23 +08:00
    @Williamp 如果是通过响应头发送的不能阻止降级攻击,而且缓存也能够实现相同的效果(强制缓存多久,然后就不会向服务器请求响应)
    Williamp
        51
    Williamp  
       2017-03-23 19:32:00 +08:00
    @lslqtz Yes, HSTS header response only sent over secure transport layer and that's why attacker get a chance to complete targeted attack.
    kcats
        52
    kcats  
       2020-01-18 14:56:41 +08:00
    我在想为啥不是浏览器直接优先发起 https 请求呢? 如果 https 失败, 再请求 http
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     882 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 20:22 PVG 04:22 LAX 13:22 JFK 16:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86