HSTS 是什么

HSTS 是什么

Google 的 .dev 域名面向公众开放,于是我去 Gandi 上看了下,注意到

域名申请条件
.dev 域名已由 Google 纳入 HSTS 列表中,因此要求此域名的所有网站都必须加密,这表示所有网站都必须使用 HTTPS。

{{0xc0032d1c70 0xc0032d1c70 https://res.cloudinary.com/leveth/image/upload/f_auto,q_auto/v1550634031/zb/2019/02/gandi-dot-dev.png  .dev 域名已由 Google 纳入 HSTS 列表中 .dev 域名已由 Google 纳入 HSTS 列表中 0xc003308a80} 0 false}

那么 HSTS 是什么呢?

HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP

https://developer.mozilla.org/zh-CN/docs/Security/HTTP_Strict_Transport_Security

这一机制可以在 HTTP 301 跳转到 HTTPS 之前先一步规避中间人攻击的风险。想想看,访问 http://example.com 的过程中是没有加密的,如果在这一阶段就搞事情的话 …

HSTS 是怎么工作的?

当通过 HTTPS 访问你的站点的时候,你的服务器返回的时候加一个 Header,Strict-Transport-Security,主要值是 max-age=xxx。在设定好的时间内,所有对于当前域名的 HTTP 请求都自动转 HTTPS。

细节可以看下 HTTP Strict Transport Security - 安全 | MDN

Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload

那,这和 .dev .app .page 等等域名有什么关系,前面说的 HSTS 列表又是什么?

HSTS 列表是什么?

谷歌维护着一个 HSTS 预加载服务。按照如下指示成功提交你的域名后,浏览器将会永不使用非安全的方式连接到你的域名。虽然该服务是由谷歌提供的,但所有浏览器都有使用这份列表的意向(或者已经在用了)。但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。

MDN / 预加载 HSTS

另外我们可以通过 https://hstspreload.org/ 来查询相关的域名是否在列表里,比如大家喜闻乐见的 example.com

{{0xc0032d1c70 0xc0032d1c70 https://res.cloudinary.com/leveth/image/upload/f_auto,q_auto/v1550637914/zb/2019/02/hstspreload_org-example_com.png Status: example.com is not preloaded. Status: example.com is not preloaded. Status: example.com is not preloaded. 0xc003309380} 1 false}
Status: example.com is not preloaded.

而 hstspreload.org 显然是在这个列表里的

{{0xc0032d1c70 0xc0032d1c70 https://res.cloudinary.com/leveth/image/upload/f_auto,q_auto/v1550637914/zb/2019/02/hstspreload_org-hstspreload_org.png Status: hstspreload.org is currently preloaded. Status: hstspreload.org is currently preloaded. Status: hstspreload.org is currently preloaded. 0xc0033093e0} 2 false}
Status: hstspreload.org is currently preloaded.

在 <hstspreload.org> 查询 .dev 可以看到整个 .dev 都是在列表里的,而查询 .com .org 等普通的域名则会告诉你不要使用一个 . 开头的域名

{{0xc0032d1c70 0xc0032d1c70 https://res.cloudinary.com/leveth/image/upload/f_auto,q_auto/v1550635538/zb/2019/02/hstspreload_org-dev.png .dev is currently preloaded .dev is currently preloaded .dev is currently preloaded 0xc003309440} 3 false}
.dev is currently preloaded

{{0xc0032d1c70 0xc0032d1c70 https://res.cloudinary.com/leveth/image/upload/f_auto,q_auto/v1550635538/zb/2019/02/hstspreload_org-com.png Status: .com is not preloaded. Status: .com is not preloaded. Status: .com is not preloaded. 0xc0033094a0} 4 false}
Status: .com is not preloaded.

怎么提交域名到 HSTS 预加载列表

还是 https://hstspreload.org/,有说明如何提交域名到 Chrome 的 HSTS Preload List

服务端需要配置 SSL 证书,将 HTTP 请求重定向到 HTTPS,提供 HSTS Header,并且 max-age 足够长,然后申请就就可以了。