具有 includeSubdomains 的子域上的 HSTS

信息安全 hsts 子域
2021-09-03 21:54:48

假设我的网站位于,foo.example.com当访问者使用 HTTPS 访问我的网站时,我发送以下 HTTP 标头:

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

HSTS 政策会对example.com或等域产生任何影响bar.example.com吗?

我不负责证书,但通用名称*.example.com在证书上,所以我不确定这是否重要。

该证书对 无效abc.foo.example.com,但我想如果这样的主机存在有效证书,则 HSTS 策略将适用于那里。

4个回答

基于 RFC HTTP Strict Transport Security (HSTS),includeSubDomains 声明:

6.1.2. includeSubDomains 指令

可选的“includeSubDomains”指令是一个无价值的指令,如果存在(即,它被“断言”),则向 UA 发出信号,表明 HSTS 策略适用于该 HSTS 主机以及主机域名的任何子域。

因此,您的 HSTS 政策仅适用于foo.example.com*.foo.example.com

example.com并且bar.example.com不会受到影响。

有关更多信息,网站管理员上有一个很棒的主题,标题是我需要通配符 SSL 证书才能包含在 HSTS 预加载列表中吗?

视情况而定,第11.4.2节描述了 Web 应用程序与子域交互但不与 HSTS 主机(abc.domain.com但不是domain.com)交互的场景,在这种情况下,UA 不会强制执行 HSTS 策略。建议是:

应该配置 HSTS 主机,以便在构成众所周知的“入口点”的每个 HSTS 主机域或子域名上直接发出 STS 标头字段

但是第11.4.1节说所有子域都必须实现 HTTPS,所以只要他们这样做就可以正常工作。

从规范:

如果 ca.example.com 使用
includeSubDomains 指令发布 HSTS 策略,那么实现与 ca.example.com Web 应用程序交互的 HSTS 的基于 HTTP 的用户代理
将无法检索 CRL 并且无法检查 OCSP 的证书,
因为这些服务是通过纯 HTTP 提供的。

在这种情况下,示例 CA 可以:

  • 不使用 includeSubDomains 指令,或

  • 确保在 ca.example.com 的子域提供的基于 HTTP 的服务也通过 TLS/SSL 统一提供,或

  • 以不同的域名提供基于 HTTP 的普通服务,例如 crl-and-ocsp.ca.example.NET,或

  • 使用另一种方法来分发证书状态信息,无需通过普通 HTTP 提供 CRL 分发和 OCSP 服务(例如,“证书状态请求”TLS 扩展 [RFC6066],通常通俗地称为“OCSP 装订”)。

HSTS 政策会对 example.com 或 bar.example.com 等域产生任何影响吗?

是的。includeSubDomains影响域名的所有子域。至关重要的foo.example.comexample.com,所有符合标准的用户代理都会将 HSTS 限制应用于*.example.com.

6.1.2. includeSubDomains 指令

可选的“includeSubDomains”指令是一个无价值的指令,如果存在(即,它被“断言”),则向 UA 发出信号,表明 HSTS 策略适用于该 HSTS 主机以及主机域名的任何子域。

强调我的)

该证书对 abc.foo.example.com 无效,但我想如果此类主机存在有效证书,则 HSTS 策略将适用于那里。

这是正确的。证书有效性与主机名是否受严格传输安全限制无关。

我已经测试了该includesubdomain指令,结果是它只影响主机域和主机域的子域。

例如,如果您使用 访问网站https://echo.local.io,并使用 查询 hsts/pkp chrome://net-internals/#hsts

echo.local.io使用(主机域)查询 HSTS/PKP 域

Found:
static_sts_domain:
static_upgrade_mode: UNKNOWN
static_sts_include_subdomains:
static_sts_observed:
static_pkp_domain:
static_pkp_include_subdomains:
static_pkp_observed:
static_spki_hashes:
dynamic_sts_domain: echo.local.io
dynamic_upgrade_mode: FORCE_HTTPS
dynamic_sts_include_subdomains: true
dynamic_sts_observed: 1634294710.318108
dynamic_sts_expiry: 1650019510.318091

使用另一个子域查询 HSTS/PKP 域foo.local.io(与主机域相同级别)

Not found

使用根域local.io(宿主域的父域)查询 HSTS/PKP 域

Not found

buzz.echo.local.io用子域(主机主的子域)查询HSTS/PKP域

Found:
static_sts_domain:
static_upgrade_mode: UNKNOWN
static_sts_include_subdomains:
static_sts_observed:
static_pkp_domain:
static_pkp_include_subdomains:
static_pkp_observed:
static_spki_hashes:
dynamic_sts_domain: echo.local.io
dynamic_upgrade_mode: FORCE_HTTPS
dynamic_sts_include_subdomains: true
dynamic_sts_observed: 1634298549.210941
dynamic_sts_expiry: 1650023349.210936

另见:https ://blog.codefarm.me/2021/10/15/http-strict-transport-security/#test-subdomain-with-echo-local-io