HSTS工作机制:
服务端配置支持HSTS后,用户访问HTTPS网站,服务器会给返回给浏览器的header头中添加一个Strict-Transport-Security字段(非加密传输时此字段无效),支持HSTS的浏览器接收到此字段,会将所有的HTTP访问请求在内部做307跳转到HTTPS,而不会产生任何网络请求(区别没有设置HSTS的网站是做302跳转将http请求转为https),然后将此网站加入到浏览器的HSTS 列表中。
遇到的问题:
上面这种情况就遇到了一种尴尬的问题,当做proxy代理时,因为要抓去https传输的数据,就需要自己伪造证书进行服务器与本地交互数据的解封包,服务器设置了HSTS,此时就无法通过浏览器的验证了
而没有设置HSTS的网站没有任何问题,添加到例外中即可
解决问题:
方法一:火狐访问"about:config" --> 右键创建->整数->整数值:test.currentTimeOffsetSeconds ->内容:11491200 然后清除浏览器缓存 再使用代理的时候就没问题了
方法二:因为HSTS的设置都有一定的时效性,可以通过修改本地时间大于一年解决(修改时间后不代理情况下有个bug,当证书过期时间小于本地修改后的时间的时候会造成很多https的资源无法加载,甚至提示证书错误无法访问)
方法三:DNS方式,如MITMf (https://github.com/byt3bl33d3r/MITMf)
最后:
方法各有优缺,针对特殊场景灵活利用,最简单的莫非改本地时间。
参考:
https://blog.wilddog.com/?p=997 等.
https://raymii.org/s/tutorials/HTTP_Strict_Transport_Security_for_Apache_NGINX_and_Lighttpd.html HTTP Strict Transport Security for Apache, NGINX and Lighttpd
2017/1/16更新:https://finnwea.com/blog/bypassing-http-strict-transport-security-hsts 含两种方法,一:NTP 二:DNS欺骗劫持