HTTP严格传输安全协议 (HSTS)

HSTS

HTTP协议最初经过TCP传输,后为了传输安全,加入了SSL/TLS做为中间层,称为HTTPS(HTTP over SSL)。当在浏览器中输入一个域名访问时,浏览器默认会经过HTTP协议访问服务器,服务端能够返回301以跳转到HTTPS,此后全部数据传输经过HTTPS传输。然而,中间人攻击者可能会攻击拦截初始的http请求,从而控制用户后续的回话。html

HTTP Strict Transport Security,即HSTS协议提供了一个机制,让服务端能够主动告知浏览器,之后的请求所有严格地经过HTTPS进行。web

HSTS如何工做

启用HSTS

服务端向浏览器发送响应时,能够在响应头部中添加Strict-Transport-Security,告知浏览器开启HSTS。chrome

如响应头部中有Strict-Transport-Security: max-age=86400表示为当前域名启用HSTS,过时时间为1天。浏览器

如响应头部中有Strict-Transport-Security: max-age=259200; includeSubDomains表示为当前域名和全部的子域名启用HSTS,过时时间为30天。安全

Tips服务器

  • 只有在安全传输中Strict-Transport-Security头部才会生效。在HTTP(而不是HTTPS)中Strict-Transport-Security头部会被忽略
  • max-age的值为TTL(即生存时间),值为0时(例如Strict-Transport-Security: max-age=0)浏览器将关闭此域名的HSTS设置

浏览器自动跳转HTTPS

对于开启了HSTS的域名,浏览器将强制采用HTTPS。dom

1. 直接访问域名时跳转

在浏览器中访问域名时,若是域名开启了HSTS,浏览器将发生内部跳转,直接跳转到HTTPS进行访问。即便用户手动输入http://domainname访问,仍会发生强制跳转。google

2. 网页中的连接跳转

网页中的资源,若是其URL的域名启用了HSTS,浏览器请求此资源时将自动跳转的HTTPS。 如网页中有连接<img src="http://qlee.in/static/logo.img>,并且qlee.in开启了HSTS,浏览器将自动到https://qlee.in/static/logo.img请求相应的资源。firefox

3. 端口的处理

HTTP默认采用80端口,HTTPS默认采用443端口。当浏览器由于HSTS执行内部跳转时code

  • 1 若是没有显式指定端口,浏览器跳转时也不会显式指定端口,默认HTTPS会访问443端口
  • 2 若是指定了80端口,浏览器跳转时会将端口转换为443端口
  • 3 若是指定了其余端口,浏览器跳转时会保留指定的端口

HSTS对SSL链接的影响

HSTS中的Strict不仅是强制跳转到HTTPS,也包含了对HTTPS链接创建的处理。开启HSTS后,一旦有警告或者错误,浏览器将直接关闭HTTPS链接。包括如下几种

  1. SSL证书过时或者验证失败。没有开启HSTS时,一旦遇到证书过时、域名不匹配、签名验证失败等状况,浏览器将要求用户选择是否继续。而开启HSTS后,浏览器将关闭链接,没法继续访问。
  2. 证书经过OCSP或CRLs等方式被撤销。

取消HSTS

1. 服务器端关闭HSTS

服务端能够经过响应的添加头部Strict-Transport-Security: max-age=0或者Strict-Transport-Security: max-age=0; includeSubDomains来告知浏览器关闭域名的HSTS

2. 浏览器端关闭HSTS

对于chrome浏览器,地址栏中输入chrome://net-internals/#hsts进入HSTS设置页面,能够查询、删除指定域名的HSTS设置,也能够手动为域名开启HSTS。

对于chrome和firefox浏览器,能够经过删除域名的历史记录来清除域名的HSTS设置。

HSTS preload list

google维护了一个称为“HSTS preload list”的站点域名和子域名列表,主流的web浏览器(Chrome, Firefox, Opera, Safari, IE 11 and Edge) 都采用了该域名列表,对列表中的域名强制开启HSTS。域名的全部者能够经过https://hstspreload.org/提交其域名。

参考连接

相关文章
相关标签/搜索