本文档介绍如何在CDN加速服务中对加速域名启用 HSTS。
HSTS 的全称是 HTTP Strict Transport Security,是一种网络安全的策略机制。HSTS 的目的是保护用户在访问 HTTPS 站点的期间免受降级攻击和 cookie 劫持。 在您对站点启用 HSTS 后,站点的响应中会包含 Strict-Transport-Security
响应头。Strict-Transport-Security
响应头告知浏览器其向站点发送的每个请求都必须使用 HTTPS 协议。
Strict-Transport-Security
响应头还包含两个参数。关于这两个参数的描述,参见 配置说明。
在进一步阐述 HSTS 之前,有必要先解释 HSTS 与强制跳转的区别。
HTTP 是一个不安全的协议。当用户在浏览器中指定 HTTP 协议向一个站点发送请求时,该请求可能会被劫持并重定向到恶意站点。为了避免 HTTP 请求访问加速域名,CDN加速服务提供了以下两个配置:
在您配置强制跳转后,如果浏览器向CDN加速服务发送了一个 HTTP 请求,CDN加速服务会返回 301 或者 302 响应状态码通知浏览器将 HTTP 请求跳转到 HTTPS 请求。关于更多强制跳转的信息,参见 强制跳转。
但是,即使您配置了强制跳转,用户依然可以在浏览器中指定 HTTP 协议向CDN加速服务发送 HTTP 请求。虽然会被跳转到 HTTPS 请求,这些 HTTP 请求在到达CDN加速服务前依然有被劫持的风险。
相比强制跳转,HSTS 提供了一个更安全的方案。在您为加速域名启用 HSTS 后,CDN加速服务的响应中会包含 Strict-Transport-Security
响应头。如果浏览器成功使用 HTTPS 协议对CDN加速服务发送过一次请求,浏览器就会缓存该响应头。假设之后用户再次在浏览器中指定 HTTP 协议访问CDN加速服务。在发送请求前,浏览器会将 HTTP 转换成 HTTPS。由于转换过程在浏览器侧发生,就能极大降低浏览器向CDN加速服务发送的 HTTP 请求的数量。同时,也降低了 HTTP 请求被劫持的风险。
虽然 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加速服务会提示您是否需要启用强制跳转的配置。参见 操作步骤。
在您启用了 HSTS 与强制跳转后,如果用户使用浏览器向CDN加速服务发送了一个 HTTP 请求,浏览器与CDN加速服务的交互过程如下:
浏览器检查是否存在已缓存的 Strict-Transport-Security
响应头。
由于浏览器缓存中不存在该响应头,浏览器向CDN加速服务发送该 HTTP 请求。
3.CDN加速服务收到该请求后,由于强制跳转的配置,CDN加速服务的响应状态码是 301 或 302。同时,由于 HSTS 的配置,响应中包含了 Strict-Transport-Security
响应头。此时,由于还未成功使用 HTTPS 协议向CDN加速服务发送过一次请求,浏览器不缓存该响应头。
由于 301 或 302 响应状态码,浏览器向CDN加速服务发送 HTTPS 请求。在响应中,CDN加速服务同样包含了 Strict-Transport-Security
响应头。假设该响应头的有效时间是 10 分钟,并且该 HTTPS 请求成功获取了请求的文件。
由于 HTTPS 请求成功,浏览器对 Strict-Transport-Security
响应头进行缓存。
在 10 分钟内,假设该用户使用浏览器再次向CDN加速服务发送 HTTP 请求。此时,浏览器与CDN加速服务的交互过程如下:
浏览器检查是否存在已缓存的 Strict-Transport-Security
响应头。
由于浏览器缓存中存在该响应头,浏览器检查该响应头是否已过期。
由于该响应头未过期,浏览器就将 HTTP 转换为 HTTPS 并向CDN加速服务发送该请求。
注意
如果缓存的 Strict-Transport-Security
响应头已过期,当该用户向CDN加速服务发送 HTTP 请求时,会重复 浏览器与CDN加速服务的交互过程 中描述的步骤。
需要注意的是,即使您已启用了 HSTS 与强制跳转,CDN加速服务收到的 HTTP 请求是无法杜绝的。因为在以下任意情况下,浏览器不会将 HTTP 转换成 HTTPS:
浏览器缓存中不存在 Strict-Transport-Security
响应头。
浏览器缓存中的 Strict-Transport-Security
响应头已过期。
登录多云CDN控制台。
在左侧导航栏,单击 CDN加速。
在CDN加速域名列表找到您的域名,单击域名名称。
在域名页面,单击 HTTPS 配置 页签。
在页面右上方,单击 编辑配置。
在 HSTS 设置 区域,设置 状态 为启用。
如果此时您还未启用强制跳转,或者您已经配置了强制跳转但是 跳转类型 不是 HTTP 到 HTTPS,CDN加速服务会询问您是否要配置强制跳转并将 跳转类型 设置为 HTTP 到 HTTPS。其原因参见 HSTS 响应头起作用的前提条件。
如果您单击 确认,CDN加速服务会对强制跳转进行相应的设置。在您单击 确认 前,请充分评估 "HTTP 请求跳转到 HTTPS 请求" 这个设置对您业务的影响。
如果您单击 忽略,CDN加速服务会保留当前强制跳转的设置。
按照 配置说明 进行设置。
设置完成后, 在页面右上角单击 提交编辑。
配置 | 说明 |
---|---|
子域名 | 表示 HSTS 配置是否应用于子域名站点。该配置取值如下:
注意 如果您设置 子域名 为 应用,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
下面以 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 分钟的延时。