使用HSTS协议强制浏览器使用HTTPS协议访问网站
大家都知道网站启用SSL数字证书后使用HTTPS协议可以保证服务器与浏览器端数据加密,但与此同时不可避免另外一个问题,总存在部分用户会直接输入域名的方式访问网站,默认浏览器是使用HTTP协议访问网站的,此时即便网站启用了SSL数字证书,此时用户与服务器端的数据交互仍然使用的是明文传输方式,用户数据得不到保护,因为SSL数字证书没有生效。
可能你会说那不如直接关闭80端口吧(好吧,如果你是API等后台服务大可不必考虑前台用户访问的问题)或HTTP访问的时候直接跳转到HTTPS协议吧(直接跳转其实也存在『中间人』攻击风险),其实这个问题有更好的方案,这就是下面要介绍的
HSTS(HTTP Strict Transport Security),它是一个Web安全策略机制(web security policy mechanism),它通过服务器为HTTP响应增加如下一个Header 来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险:
Strict-Transport-Security:max-age=63072000; includeSubdomains; preload
只要在服务器返回给浏览器的响应头中,增加 Strict-Transport-Security这个HTTP Header 浏览器都将直接强制性的发起HTTPS请求,现在访问机制如下
HSTS Header max-age参数为有效期,在有效期内,浏览器只要向xxx或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。
通常如果因为过期或其他原因导致SSL证书失效的时候,浏览器会提示我们证书失效并提示风险,但我们仍然能够访问网站,如果使用了HSTS后则服务器将严格禁止继续访问,提示如下
不足和缺陷
至此,你可能会发现,HSTS协议其他还是有他的缺陷,即用户首次访问的时候依然要借助HTTP协议返回HSTS Header,这将依然会产生一次中间人攻击风险。
Preload List
针对上面的攻击,HSTS也有应对办法,那就是在浏览器里内置一个列表,只要是在这个列表里的域名,无论何时、何种情况,浏览器都只使用HTTPS发起连接。这个列表由Google Chromium维护,FireFox、Safari、IE等主流浏览器均在使用。
可以在HSTS Preload List的官网上(https://hstspreload.org)提交申请,或者了解更多详细的内容。
2017-8-1 更新
百度近期推出了HTTPS认证,在百度站长工具里面认证通过后网站收录自动替换为HTTPS协议,结合HSTS进一步降低了入口风险,毕竟很多用户流量都来自百度