You need to enable JavaScript to run this app.
导航
HSTS 设置
最近更新时间:2024.09.05 10:59:21首次发布时间:2023.03.08 16:58:01

本文档介绍如何在火山引擎内容分发网络(CDN)中对加速域名启用 HSTS。

HSTS 概述

HSTS 的全称是 HTTP Strict Transport Security,是一种网络安全的策略机制。HSTS 的目的是保护用户在访问 HTTPS 站点的期间免受降级攻击和 cookie 劫持。 在您对站点启用 HSTS 后,站点的响应中会包含 Strict-Transport-Security 响应头。Strict-Transport-Security 响应头告知浏览器其向站点发送的每个请求都必须使用 HTTPS 协议。

Strict-Transport-Security 响应头还包含两个参数。关于这两个参数的描述,参见 配置说明

HSTS 与强制跳转

在进一步阐述 HSTS 之前,有必要先解释 HSTS 与强制跳转的区别。

HTTP 是一个不安全的协议。当用户在浏览器中指定 HTTP 协议向一个站点发送请求时,该请求可能会被劫持并重定向到恶意站点。为了避免 HTTP 请求访问加速域名,CDN 提供了以下两个配置:

  • 强制跳转。在启用强制跳转后,您需要设置 跳转类型HTTP 到 HTTPS
  • HSTS。

强制跳转的局限

在您配置强制跳转后,如果浏览器向 CDN 发送了一个 HTTP 请求,CDN 会返回 301 或者 302 响应状态码通知浏览器将 HTTP 请求跳转到 HTTPS 请求。关于更多强制跳转的信息,参见 强制跳转

但是,即使您配置了强制跳转,用户依然可以在浏览器中指定 HTTP 协议向 CDN 发送 HTTP 请求。虽然会被跳转到 HTTPS 请求,这些 HTTP 请求在到达 CDN 前依然有被劫持的风险。

HSTS 的优势

相比强制跳转,HSTS 提供了一个更安全的方案。在您为加速域名启用 HSTS 后,CDN 的响应中会包含 Strict-Transport-Security 响应头。如果浏览器成功使用 HTTPS 协议对 CDN 发送过一次请求,浏览器就会缓存该响应头。假设之后用户再次在浏览器中指定 HTTP 协议访问 CDN。在发送请求前,浏览器会将 HTTP 转换成 HTTPS。由于转换过程在浏览器侧发生,就能极大降低浏览器向 CDN 发送的 HTTP 请求的数量。同时,也降低了 HTTP 请求被劫持的风险。

HSTS 响应头起作用的前提条件

虽然 HSTS 方案更安全,但是要使浏览器遵循 Strict-Transport-Security 响应头将 HTTP 转换成 HTTPS,以下条件必须满足:

  • 浏览器已缓存了 Strict-Transport-Security 响应头。

  • 已缓存的响应头未过期。关于 Strict-Transport-Security 响应头的缓存有效时间,参见 配置说明

在加速域名启用了 HSTS 后,CDN 在响应任何请求时都会返回 Strict-Transport-Security 响应头。但要使浏览器缓存该响应头,浏览器必须成功使用 HTTPS 协议向 CDN 发送过一次请求。因此,在您启用 HSTS 时,推荐您也启用强制跳转并设置 跳转类型HTTP 到 HTTPS

说明

当您在 CDN 控制台中启用 HSTS 时,CDN 会提示您是否需要启用强制跳转的配置。参见 操作步骤

浏览器与 CDN 的交互过程

在您启用了 HSTS 与强制跳转后,如果用户使用浏览器向 CDN 发送了一个 HTTP 请求,浏览器与 CDN 的交互过程如下:

  1. 浏览器检查是否存在已缓存的 Strict-Transport-Security 响应头。

  2. 由于浏览器缓存中不存在该响应头,浏览器向 CDN 发送该 HTTP 请求。

  3. CDN 收到该请求后,由于强制跳转的配置,CDN 的响应状态码是 301 或 302。同时,由于 HSTS 的配置,响应中包含了 Strict-Transport-Security 响应头。此时,由于还未成功使用 HTTPS 协议向 CDN 发送过一次请求,浏览器不缓存该响应头。

  4. 由于 301 或 302 响应状态码,浏览器向 CDN 发送 HTTPS 请求。在响应中,CDN 同样包含了 Strict-Transport-Security 响应头。假设该响应头的有效时间是 10 分钟,并且该 HTTPS 请求成功获取了请求的文件。

  5. 由于 HTTPS 请求成功,浏览器对 Strict-Transport-Security 响应头进行缓存。

在 10 分钟内,假设该用户使用浏览器再次向 CDN 发送 HTTP 请求。此时,浏览器与 CDN 的交互过程如下:

  1. 浏览器检查是否存在已缓存的 Strict-Transport-Security 响应头。

  2. 由于浏览器缓存中存在该响应头,浏览器检查该响应头是否已过期。

  3. 由于该响应头未过期,浏览器就将 HTTP 转换为 HTTPS 并向 CDN 发送该请求。

注意

  • 如果缓存的 Strict-Transport-Security 响应头已过期,当该用户向 CDN 发送 HTTP 请求时,会重复 浏览器与 CDN 的交互过程 中描述的步骤。

  • 需要注意的是,即使您已启用了 HSTS 与强制跳转,CDN 收到的 HTTP 请求是无法杜绝的。因为在以下任意情况下,浏览器不会将 HTTP 转换成 HTTPS:

    • 浏览器缓存中不存在 Strict-Transport-Security 响应头。

    • 浏览器缓存中的 Strict-Transport-Security 响应头已过期。

启用 HSTS 的前提条件

要启用 HSTS,您必须已对加速域名已 配置了证书

操作步骤

  1. 登录 火山引擎内容分发网络控制台

  2. 在左侧导航栏,点击 域名管理

  3. 域名管理 页面,找到需要配置的域名,点击 管理

  4. 在域名页面上,点击 HTTPS 配置 页签。

  5. 在页面右上方,点击 编辑配置

  6. HSTS 设置 下方,设置 状态 为启用。

  7. 如果此时您还未启用强制跳转,或者您已经配置了强制跳转但是 跳转类型 不是 HTTP 到 HTTPS,CDN 会询问您是否要配置强制跳转并将 跳转类型 设置为 HTTP 到 HTTPS。其原因参见 HSTS 响应头起作用的前提条件。

    • 如果您点击 确认,CDN 会对强制跳转进行相应的设置。在您点击 确认 前,请充分评估 "HTTP 请求跳转到 HTTPS 请求" 这个设置对您业务的影响。

    • 如果您点击 忽略,CDN 会保留当前强制跳转的设置。
      alt

  8. 按照 配置说明 进行设置。

  9. 设置完成后, 在页面右上角点击 提交编辑

alt

配置说明

配置说明

过期时间

表示 Strict-Transport-Security 响应头在浏览器中的缓存过期时间。该配置对应响应头中的 max-age 参数。在发送一个 HTTP 请求前,浏览器会检查其缓存的 Strict-Transport-Security 响应头是否已经过期。如果该响应头已过期,浏览器不会将 HTTP 转换成 HTTPS。

您最长可以设置的时间是 31,536,000 秒,表示 365 天。如果您设置过期时间为 0,其效果等同于禁用 HSTS。

需要留意的是,对于浏览器收到的每个响应,如果响应中包含 Strict-Transport-Security 响应头,浏览器会使用收到的响应头的过期时间来替换缓存的响应头的过期时间。

子域名

表示 HSTS 配置是否应用于子域名站点。该配置取值如下:

  • 不应用:表示 HSTS 配置不应用于子域名站点。

  • 应用:表示 HSTS 配置应用于子域名站点。此时,响应头会包含 includeSubDomains 参数。

注意

如果您设置 子域名应用,CDN 返回的响应头是告知浏览器向所有子域名发送的请求也必须使用 HTTPS 协议。此时,子域名站点必须是可以使用 HTTPS 协议访问的。并且,子域名也要有一个类似配置将访问子域名的 HTTP 请求强制跳转到 HTTPS 请求。

举例

  • 例子 1:您指定过期时间是 6 秒并且 HSTS 配置应用于子域名。此时,CDN 实际返回的响应头如下:

    • Strict-Transport-Security: max-age=6;includeSubDomains
  • 例子 2:您指定过期时间是 1 天并且 HSTS 配置不应用于子域名。此时,CDN 实际返回的响应头如下:

    • Strict-Transport-Security: max-age=86400

更多信息

如何在浏览器中管理 HSTS 配置

下面以 Google Chrome 和 Microsoft Edge 为例,阐述如何在浏览器中管理 HSTS 配置。

在 Chrome 或 Edge 中,访问以下 URL:

  • chrome://net-internals/#hsts

在打开的页面中,您可以:

  • 将一个域名添加到浏览器的 HSTS 缓存中。

  • 从浏览器的 HSTS 缓存中删除指定的域名。

  • 查询一个域名是否存在于浏览器的 HSTS 缓存中。

    • 如果该域名不存在,查询结果是 Not found

    • 如果该域名存在,查询结果会展示该域名的 HSTS 配置信息。在配置信息中,dynamic_sts_observed 表示浏览器缓存该域名的时间,时间格式是 Unix 时间戳。dynamic_sts_expiry 表示该域名在 HSTS 缓存中的过期时间。

在您查询一个域名时,结果数据可能会有 1 分钟的延时。