Firefox 4: HTTP 严格传输安全 (强制 HTTPS)

这篇文章介绍一个新的 HTTPS 头部:Strict-Transport-Security,它可以强制网站通过 HTTPS 访问。此功能将在 Firefox 4 中提供。

您如何输入 URL?

您是否始终在 URL 前面加上 http://https://?或者您只是输入 example.com 并让浏览器自动添加 http://,就像大多数人一样?

如果网页提供了一个 https 版本,但您通过 http 访问它,会发生什么?网站的 http 版本会将您重定向到 https,但您首先与网站的非加密版本进行了通信。

这些行为可能会被利用来执行中间人攻击

为了避免这种情况,您可能希望强制您的网站通过 https 访问,将任何 http://x.com 请求转换为 https://x.com(无需客户端-服务器对话)。

Sid Stamm 最近将 HTTP 严格传输安全 (HSTS) 集成到
Firefox 中。HSTS 在IETF 草案中定义,允许网站指定何时希望仅通过 https 访问。

网站可以通过服务器在 HTTPS 响应期间 设置的 HTTP 头部为其域指定严格传输安全

Strict-Transport-Security: max-age=15768000

Strict-Transport-Security: max-age=15768000 ; includeSubDomains

max-age 设置强制 HTTPS 的记忆时长(以秒为单位)。如果
includeSubDomains 设置为 true,则此规则也将应用于所有子域。

将来,如果任何请求在到达网络之前尝试通过 http 访问 x.com,则会将其修改为通过 https 访问。

此头部不会在非加密 HTTP 事务期间被考虑,因为用户代理不知道 https 是否实际存在,而且头部可能会被攻击者注入。

关于 Paul Rouget

Paul 是 Firefox 开发人员。

更多 Paul Rouget 的文章…


41 条评论

  1. zoonman

    这是一个非常好的主意,告诉浏览器使用 HTTPS,但 HTTPS 比普通 HTTP 对服务器的负载更大。这对高负载项目、社交和媒体网络来说不是一个好的决定。

    2010 年 8 月 26 日 下午 10:59

    1. kl

      这已经被驳斥了。Gmail 切换到全 HTTPS,仅使用了 1% 的额外 CPU。

      http://www.imperialviolet.org/2010/06/25/overclocking-ssl.html

      2011 年 7 月 12 日 下午 3:01

  2. Ferdinand

    @ zoonman 我想你没有读到文章中提到的网站可以选择启用此功能。

    2010 年 8 月 26 日 下午 2:00

    1. zoonman

      你说得对!

      2010 年 8 月 26 日 下午 10:51

  3. Tomer

    为什么这很好?例如,我更喜欢 Twitter 的安全版本是永久性的。为什么它比强制网站通过 HTTPS 为我们提供内容更好?

    2010 年 8 月 26 日 下午 2:23

    1. Sid

      @Tomer:我认为您想到的是那些安全意识强的用户,他们有意通过 HTTPS 访问网站,因为他们希望保护自己。HSTS 有助于网站通过告诉浏览器默认使用 HTTPS 来保护 *所有* 用户(而不仅仅是安全意识强的用户)。目标是为网站提供一种工具,以便他们可以悄无声息地保护用户免受这些中间人攻击。

      也许在理想的世界中,所有网站都会使用 HTTPS,或者这将成为默认设置,但事实并非如此。正如 @zoonman 所提到的,这并不总是重要的,有时甚至不切实际。

      2010 年 8 月 26 日 下午 4:38

      1. Tomer

        我更喜欢自己选择 HTTPS 连接,因为有些网站不会自动将我们转移到安全版本,甚至不会限制在安全区域设置的 cookie 仅限于安全区域。告诉人们访问普通版本以查看网站是否建议切换到 HTTPS 并不安全,因为它需要一个 HTTP 请求,这可能会以明文形式传输用户身份验证 cookie。

        它比使用 HTTP 101 SWITCH 状态码更好吗?

        2010 年 8 月 26 日 下午 11:53

        1. Sid

          @Tomer:HTTP 101 SWITCH 状态码在大多数情况下都能正常工作,但当用户处于不安全的网络时,中间人攻击者可能会拦截该响应,导致用户看到由攻击者控制的网站的 HTTP 版本。

          使用 HSTS,用户只需要访问网站的 HTTPS 版本一次(可能使用您提到的 HTTP 101 答复),此时会向浏览器提供 Strict-Transport-Security 头部。之后,浏览器将自动假设将来该网站使用 HTTPS,从而大大降低中间人攻击的可能性,并减少发送到其服务器的不安全 HTTP 请求数量。

          总的来说,*您* 已经得到很好的保护,因为您手动选择了 HTTPS,但这对于那些没有注意到安全指标的用户来说,是一种网站帮助他们安全的方式。

          2010 年 8 月 27 日 上午 7:47

  4. James

    @Tomer:HTTP 101 是客户端发送给服务器的请求。HSTS 是服务器发送给客户端的请求。

    @Sid:感谢您的辛勤工作。我知道 PayPal 参与了草案的制定,但我希望您使用 x.com 以外的其他示例域。

    2010 年 8 月 27 日 上午 0:28

  5. annie

    强制 HTTPS 会阻止像 Palo Alto 应用程序防火墙这样的工具执行中间人攻击,以便它可以解密和分析 HTTPS 流量吗?因为 Palo Alto 应用程序防火墙可以通过向客户端浏览器提供自己的证书来拦截所有 HTTPS 流量,然后使用自己的证书连接到网站,从而执行中间人攻击以进行流量分析。DNS-Sec 是否可以与 HTTPS 结合使用以进行证书验证,以便浏览器可以执行 DNS 查询以获取有效证书的加密校验和。如果 HTTPS 证书校验和与加密的 DNS-Sec 记录不匹配,浏览器将显示“安全违规 - 检测到中间人攻击”。

    2010 年 8 月 29 日 上午 1:08

    1. Sid

      @annie:我不知道防火墙的具体工作原理,但防火墙必须为其拦截的每个站点获取有效证书,这些证书链接到 Firefox 中的根证书。自签名证书将导致出现通常的“连接错误”页面,但对于 HSTS 主机,用户将无法忽略警告,并且将无法通过错误的证书访问站点。

      DNS-Sec 可能有用,但我们仍在探索如何将其与 HSTS 等功能结合使用以加强站点安全。

      2010 年 8 月 31 日 上午 8:55

  6. Sten

    嗨 *

    我认为简单的 DNS 欺骗会绕过 HSTS。

    还要记住,基于服务器证书的 SSL 连接也容易受到中间人攻击。

    不,HSTS 不是解决方案。我们必须找到更好的方法。

    g,
    sten

    2010 年 8 月 29 日 下午 4:42

  7. Mike

    由于用户通常不了解浏览器和互联网的使用,我不相信 HSTS 会阻止中间人攻击。
    主要原因是用户经常会信任不受信任的 SSL 证书,并简单地点击“是”。

    此外,强制使用 HTTPS 无法从信息角度解决问题。
    网站的 HTTP 页面通常包含与 HTTPS 版本不同的信息。

    2010 年 8 月 30 日 下午 11:12

  8. Sid

    @Sten:虽然 DNS 欺骗会造成一些干扰,但这种攻击仍然需要攻击者为欺骗的站点获取一个有效的证书,该证书链接到 Firefox 中的 CA。

    @Mike:为了简洁起见,并且为了不使非技术受众感到厌烦,我在博客文章中省略了一些技术细节。如果您查看规范,HSTS 的含义不仅仅是“将来通过 https 访问我”。它还要求浏览器在遇到无效证书时立即断开连接,*并且没有任何补救措施*。这意味着如果 mozilla.org 是一个 HSTS 主机,那么不仅 HTTPS 连接会自动进行,而且任何自签名、已过期或其他错误证书都会导致连接断开,用户不会被提示绕过阻塞。

    在我们具体的实现中,通常的证书错误页面有一个“添加例外”按钮,供“知道自己在做什么”的用户使用。如果连接被停止是因为 HSTS 主机,那么这个按钮就不会出现。(此外,如果过去曾经添加过无效证书例外,一旦主机被赋予 HSTS 状态,它就会被忽略。)

    2010 年 8 月 31 日 下午 08:52

  9. Sten

    @sid:不,在欺骗 DNS 后,我会使用普通的 HTTP 连接。
    简单有效。

    @mike:我同意你关于最终用户 (ICT) 无知的观点。

    2010 年 9 月 1 日 上午 01:47

    1. Sid

      @Sten:如果你欺骗了 DNS 记录,你就可以控制流量,但浏览器仍然会要求所有设置了 HSTS 的主机使用 HTTPS(无论 IP 地址是什么)。例如,如果我在家访问 https://useshsts.com,Firefox 会看到该网站想要使用 HSTS。然后我到一家咖啡馆,你欺骗了 DNS 并将我重定向到你的网站,我的浏览器将拒绝让我通过 HTTP 连接到你的网站,因为它需要一个有效的、安全的 HTTPS 连接到 useshsts.com。

      也许我对攻击的理解有误,你能详细说明一下吗?

      2010 年 9 月 1 日 下午 15:35

  10. Sten

    @sid:你描述的是来自先前连接的缓存数据。在这种情况下,你可能会受到保护。
    我的攻击将在缓存不存在时起作用。
    HSTS 将查找 DNS 以确定是否需要 HSTS 操作。
    现在,如果我欺骗了 DNS,我的意思是 DNS 欺骗,而不是使用 ARP 欺骗之类的 IP 欺骗,我将获得控制权。
    浏览器不会仅仅因为欺骗的 DNS 不会要求浏览器这样做而使用 HSTS。

    你如何解决以下情况?
    网站过去曾使用 HSTS,但现在想要停止使用它。由于缓存数据,用户无法连接到 HTTP 网站?!

    2010 年 9 月 2 日 上午 12:10

    1. Sid

      @Sten,是的,要使 HSTS 正常工作,你必须通过 HTTPS 成功访问真实网站一次。

      HSTS 完全没有与 DNS 绑定,因此我不确定它如何与你的攻击联系起来。服务器指示使用 HSTS 的信息是通过 HTTP 传递的。

      为了防止启动引导的需要,我们可以在发布 Firefox 时预加载想要使用 HSTS 的网站——就像 CA 根一样,这些网站永远不会通过 HTTP 请求。此外,我们可以添加一个 UI,以便用户可以为他们想要仅通过 HTTPS 访问的网站设置 HTTPS 仅访问(我们正在开发此功能)。

      网站的 Strict-Transport-Security 标头是根据 Firefox 所看到的每个 HTTPS 响应来考虑的。该标头中的最新数据被理解为对网站首选项的更新。如果一个网站想要停止使用 HSTS,它可以设置“max-age=0”,告诉浏览器不要记住该网站的 HSTS。

      2010 年 9 月 2 日 下午 13:57

  11. Sten

    @sid:抱歉,不知何故,我把 DNS sec 和 HSTS 混淆了。

    你描述的预加载将解决我们之前讨论的安全性问题。此外,攻击场景或多或少是学术性的。第一次访问必须是欺骗的访问……发行版可能会造成比它解决的问题更多的麻烦。

    让我们看看以下情况
    黑客将欺骗原始网站(DNS 欺骗)并提供
    当浏览器请求到达恶意 web 服务器页面时,max-age=0。

    2010 年 9 月 2 日 下午 14:30

    1. Sid

      @Sten:你提到的情况不应该发生。一旦为一个网站设置了 HSTS,连接将只通过 HTTPS 建立,并且只有当 HTTPS 连接没有错误时才会建立。不仅如此,除非连接是通过 HTTPS 建立并且没有证书错误(无论网站是否已经设置了 HSTS),否则 Strict-Transport-Security 标头将被忽略。这意味着攻击者需要为他们正在欺骗的网站拥有有效的 SSL 证书,以便更改网站的 HSTS 状态。

      2010 年 9 月 2 日 下午 14:36

  12. Sten

    @sid:好的,这听起来不错。浏览器中的软件会代替用户采取行动。很好,因为普通用户不是安全专家。
    HSTS 看起来很有前途,你让我信服了……至少现在有 4 个人信服了 ;-)

    2010 年 9 月 2 日 下午 14:55

  13. Mike

    @Sid

    感谢你提供的额外说明。

    只是好奇:HSTS 是在服务器端触发的,当“某些事情”出错时会断开连接。例如证书。

    当服务器拥有正确的证书,但用户没有时,HSTS 会有什么影响?
    例如,服务器要求用户拥有有效的证书才能访问 HTTPS 网站的内容。
    我假设你第一次访问网站时,它会断开连接,因为“某些事情”出错。但是,当用户第二次访问时,他拥有有效的证书,会发生什么?

    细微变化 1:当用户在访问网站时,网站的证书过期,并且在 HSTS 验证之后,会发生什么?

    细微变化 2:当用户在访问网站时,用户的证书过期,并且在 HSTS 验证之后,会发生什么?

    变化 1 和 2 是否会遵循与没有 HSTS 时的常规行为,或者 HSTS 会导致与我们现在习惯的行为不同的行为?

    2010 年 9 月 2 日 下午 15:28

    1. Sid

      @Mike:HSTS 不处理客户端证书。

      HSTS 也不会记住它以前见过哪些证书;它只会在用于连接的证书没有连接到浏览器中的根证书 _并且_ 主机已请求 HSTS 状态时才会启动。此时,唯一重要的是 (1) 证书链有效,以及 (2) 证书被授权用于加密给定主机的通信。

      变化 1(连接期间服务器证书过期):与没有 HSTS 时的行为相同。只有在建立连接时才会强制执行 HSTS。

      变化 2(连接期间客户端证书过期):与没有 HSTS 时的行为相同;HSTS 不会影响客户端证书的行为。

      2010 年 9 月 2 日 下午 16:35

  14. Pat

    使用 HSTS,我的无线网络门户网站如何最好地处理以 https 为主页的用户?我需要他们在访问网络之前被重定向到门户身份验证页面。

    如果我的网站使用自己的证书拦截,Firefox 4 会怎么做?在 HSTS 之前,浏览器会给出证书警告,用户可以点击继续。

    2010 年 9 月 6 日 上午 09:04

  15. Pat

    它是 beta 4 的一部分吗?

    2010 年 9 月 6 日 上午 09:15

    1. Sid

      @Pat:HSTS 位于 beta 5 中。

      对于没有积极使用 HSTS 的 https 主页,你的网络门户网站将继续起作用,但对于那些使用 HSTS 的主页,https 错误页面上将没有“添加例外”按钮。

      我更喜欢使用其他方法来代替要求用户使用自己的证书拦截网络门户网站的登录页面,因为这实际上是在要求用户授权拦截他们加密的主页流量。相反,你可以要求用户直接启动与你的门户网站的连接——这将与使用 HSTS 的主页并行工作。

      2010 年 9 月 8 日 上午 09:24

      1. Pat

        我同意使用我们的证书拦截不是一种好方法。事实上,虽然我们已经测试过它“有效”,但我们还没有部署它,因为它是一种不好的做法。

        我们的常见问题解答确实告诉用户使用非安全网站进行重定向。不幸的是,有些用户永远无法通过 https 超时。他们认为这是网络问题。

        还有其他几个选项

        – 在 HSTS 错误页面上,你可以列出类似“如果你通过 WiFi 热点连接,你可能需要在连接到网络之前注册”的内容。可以包含指向 Mozilla FF 常见问题解答的网址。如果用户选择 Mozilla FF 网址,他们将被重定向。

        – 浏览器可以检测 WISPr 标签并让用户知道他们正在通过 WiFi 热点连接吗?

        2010 年 9 月 8 日 上午 12:53

        1. Pat

          为了澄清,在 WiFi 热点场景中,当 HTTPS 请求超时时,如果浏览器错误页面实现上述建议中的任何一个,将非常有用。

          2010 年 9 月 8 日 下午 16:01

      2. Pat

        Sid,

        我测试了 beta5,HSTS 的工作效果符合预期。当我使用我们的证书拦截时,我收到了没有点击继续功能的警告页面。事实上,点击“让我离开这里”按钮会导致用户被重定向到 WiFi 热点。

        如果浏览器超时页面有一个类似的按钮就好了。

        2010 年 9 月 9 日 上午 12:11

        1. Audin Malmin

          的确,这正变得越来越重要。随着这些功能的实施而没有事先考虑,网络门户网站的开发和使用变得越来越痛苦。“增强安全性”证书是另一个给网络门户网站带来巨大问题的功能。它经常会导致浏览器看起来好像卡住了。这不是理想的 UI 处理方式……

          2010 年 11 月 2 日 下午 16:44

  16. Hans W.

    @Pat:这种拦截方式由于很多原因是个坏主意,你应该停止这样做。

    2010 年 9 月 8 日 上午 05:36

    1. Pat

      @Hans:这仅仅是测试。我们不会在生产环境中这样做。但仍然需要一种方法来处理 https 用户。很多人不知道 https 请求超时时该怎么办。

      2010 年 9 月 11 日 上午 07:29

  17. zink

    在 about:config 中是否有任何选项可以禁用 HSTS?

    2010 年 9 月 8 日 上午 12:30

  18. steven olson

    你的 FIREFOX 下载是 CROUPT 无效的,你能修复你的 FIREFOX 文件吗?
    它们不工作

    2010 年 9 月 17 日 上午 08:08

  19. Joshua

    是否有关于禁用此功能的 about:config 选项?我想从代理后面使用 Firefox 4 beta 6,但在没有进入私人浏览的情况下,这对于 HTTPS 网站是不可能的。

    2010 年 10 月 20 日 上午 09:26

  20. Doug Wright

    有没有办法告诉 Firefox “忘记”它为特定网站看到的所有 HSTS 标头?这对于网站的 QA/测试似乎非常重要。

    2010 年 11 月 4 日 上午 07:56

  21. Ano Nym

    我花了两个小时才弄清楚为什么所有对我的服务器的 HTTP 请求都被执行为 HTTPS 请求。我不得不调试 permissions.sqlite 中的条目。

    感谢你实施了这个有价值的功能。

    2010 年 12 月 19 日 上午 08:07

  22. valchazzz

    当 max-age 超时时会发生什么?如果黑客再次出现,黑了 HTTP 页面,当 max-age 超时时会发生什么?浏览器会强制检查 HTTPS 网站中的 Strict-Transport-Security 标头,还是会停留在黑客入侵的 HTTP 页面上?

    2011 年 1 月 6 日 上午 09:14

  23. Jason

    以当今服务器的速度,HTTPS 的负载微不足道。

    2011 年 3 月 16 日 上午 08:23

  24. Leandro

    由于所有这些原因,Facebook 页面中的新 Iframe-app 选项卡无法在 Firefox 4 中查看……我非常喜欢 FF,但反对 Facebook 的做法没有未来。

    2011 年 4 月 1 日 下午 15:06

  25. ouinonoui

    不理解这种奇怪的态度。

    “””
    如果一个网页提供了一个 https 版本,但你通过 http 访问它,会发生什么?该网站的 http 版本会将你重定向到 https,但你首先与该网站的非加密版本进行了通信。
    这些行为可以被利用来执行中间人攻击。”””

    我需要更精确地解释一下那部分吗?

    https 是安全的还是不安全的? 为什么呢? 因为我们访问了一个页面 http://x.com 然后 https://x.com 就不再安全了?

    这个维基百科文章“中间人攻击”的链接如何适用?

    如果原因如此轻微,HSTC 也安全吗? 我们在做什么,总是没有理由地改变东西?

    2011年6月14日 03:29

本文评论已关闭。