来源 https://www.cnblogs.com/luckcs/articles/6944535.htmlcss
在网站全站HTTPS后,若是用户手动敲入网站的HTTP地址,或者从其它地方点击了网站的HTTP连接,一般依赖于服务端301/302跳转才能使用HTTPS服务。而第一次的HTTP请求就有可能被劫持,致使请求没法到达服务器,从而构成HTTPS降级劫持。这个问题目前能够经过HSTS(HTTP Strict Transport Security,RFC6797)来解决。html
HSTS(HTTP Strict Transport Security)是国际互联网工程组织IETF发布的一种互联网安全策略机制。采用HSTS策略的网站将保证浏览器始终链接到该网站的HTTPS加密版本,不须要用户手动在URL地址栏中输入加密地址,以减小会话劫持风险。前端
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须经过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器须要先在本地替换为HTTPS以后再发送请求。linux
includeSubDomains,可选参数,若是指定这个参数,代表这个网站全部子域名也必须经过HTTPS协议来访问。nginx
preload,可选参数,一个浏览器内置的使用HTTPS的域名列表。web
虽然HSTS能够很好的解决HTTPS降级攻击,可是对于HSTS生效前的首次HTTP请求,依然没法避免被劫持。浏览器厂商们为了解决这个问题,提出了HSTS Preload List
方案:内置一份能够按期更新的列表,对于列表中的域名,即便用户以前没有访问过,也会使用HTTPS协议。chrome
目前这个Preload List由Google Chrome维护,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。若是要想把本身的域名加进这个列表,首先须要知足如下条件:shell
拥有合法的证书(若是使用SHA-1证书,过时时间必须早于2016年);apache
将全部HTTP流量重定向到HTTPS;vim
确保全部子域名都启用了HTTPS;
输出HSTS响应头:
max-age不能低于18周(10886400秒);
必须指定includeSubdomains参数;
必须指定preload参数;
即使知足了上述全部条件,也不必定能进入HSTS Preload List
,更多信息能够查看:https://hstspreload.org/
。
经过Chrome的chrome://net-internals/#hsts
工具,能够查询某个网站是否在Preload List之中,还能够手动把某个域名加到本机Preload List。
HSTS并非HTTP会话劫持的完美解决方案。用户首次访问某网站是不受HSTS保护的。这是由于首次访问时,浏览器还未收到HSTS,因此仍有可能经过明文HTTP来访问。
若是用户经过HTTP访问HSTS保护的网站时,如下几种状况存在降级劫持可能:
之前从未访问过该网站
最近从新安装了其操做系统
最近从新安装了其浏览器
切换到新的浏览器
切换到一个新的设备,如:移动电话
删除浏览器的缓存
最近没访问过该站而且max-age过时了
解决这个问题目前有两种方案:
方案一:在浏览器预置HSTS域名列表,就是上面提到的HSTS Preload List
方案。该域名列表被分发和硬编码到主流的Web浏览器。客户端访问此列表中的域名将主动的使用HTTPS,并拒绝使用HTTP访问该站点。
方案二:将HSTS信息加入到域名系统记录中。但这须要保证DNS的安全性,也就是须要部署域名系统安全扩展。
其它可能存在的问题
因为HSTS会在必定时间后失效(有效期由max-age指定),因此浏览器是否强制HSTS策略取决于当前系统时间。大部分操做系统常常经过网络时间协议更新系统时间,如Ubuntu每次链接网络时,OS X Lion每隔9分钟会自动链接时间服务器。攻击者能够经过伪造NTP信息,设置错误时间来绕过HSTS。
解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。好比:Windows 8每7天更新一次时间,而且要求每次NTP设置的时间与当前时间不得超过15小时。
目前主流浏览器都已经支持HSTS特性,具体可参考下面列表:
Google Chrome 4及以上版本
Firefox 4及以上版本
Opera 12及以上版本
Safari从OS X Mavericks起
Internet Explorer及以上版本
HSTS(HTTP Strict Transport Security) 简单来讲就是由浏览器进行http向https的重定向。若是不使用HSTS,当用户在浏览器中输入网址时没有加https,浏览器会默认使用http访问,因此对于https站点,一般会在服务端进行http至https的重定向。若是用了HSTS,就能够减小服务端的此次重定向。
当咱们部署https时,发现HSTS的这个用处后,立马就使用了它,使用方法很简单——在响应头中加上 strict-transport-security:max-age=31536000 。
但后来经过星巴克的WiFi访问咱们的https站点时发现了一个问题。在浏览器中输入网址后,没有出现星巴克WiFi的登陆页面,而是浏览器认为这是不安全链接,不容许访问,只能先访问一个http站点,出现星巴克WiFi登陆页面并完成登陆后才能访问咱们的https站点。
背后的缘由很简单,因为咱们的站点启用了HSTS,浏览器默认会以https方式发出请求,星巴克的WiFi拦截了请求,以http的方式返回了WiFi登陆页面,浏览器收到后一看这不安全,立马中止链接。若是不启用HSTS,在服务端进行重定向,就不会有这个问题。
只要基于http进行验证的WiFi都会有这个问题,因此在部署https时是否启用HSTS须要考虑这个因素。若是你原先启用HSTS,如今想取消,不能直接去掉strict-transport-security响应头,而是要改成 strict-transport-security:max-age=0 ,否则以前使用了HSTS的浏览器在过时以前会一直使用HSTS。
服务器开启HSTS的方法是:当客户端经过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security
字段。非加密传输时设置的HSTS字段无效。
最佳的部署方案是部署在离用户最近的位置,例如:架构有前端反向代理和后端Web服务器,在前端代理处配置HSTS是最好的,不然就须要在Web服务器层配置HSTS。若是Web服务器不明确支持HSTS,能够经过增长响应头的机制。若是其余方法都失败了,能够在应用程序层增长HSTS。
HSTS启用比较简单,只需在相应头中加上以下信息:
Strict-Transport-Security: max-age=63072000; includeSubdomains;preload;
Strict-Transport-Security
是Header字段名,max-age
表明HSTS在客户端的生效时间。 includeSubdomains
表示对全部子域名生效。preload是使用浏览器内置的域名列表。
HSTS策略只能在HTTPS响应中进行设置,网站必须使用默认的443端口;必须使用域名,不能是IP。所以须要把HTTP重定向到HTTPS,若是明文响应中容许设置HSTS头,中间人攻击者就能够经过在普通站点中注入HSTS信息来执行DoS攻击。
$ vim /etc/apache2/sites-available/hi-linux.conf # 开启HSTS须要启用headers模块 LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so <VirtualHost *:80> ServerName www.hi-linux.com ServerAlias hi-linux.com ... #将全部访问者重定向到HTTPS,解决HSTS首次访问问题。 RedirectPermanent / https://www.hi-linux.com/ </VirtualHost> <VirtualHost 0.0.0.0:443> ... # 启用HTTP严格传输安全 Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" ... </VirtualHost>
重启Apache服务
$ service apche2 restart
$ vim /etc/nginx/conf.d/hi-linux.conf server { listen 443 ssl; server_name www.hi-linux.com; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; ... } server { listen 80; server_name www.hi-linux.com; return 301 https://www.hi-linux.com$request_uri; ... }
重启Nginx服务
$ service nginx restart
要在IIS上启用HSTS须要用到第三方模块,具体可参考:https://hstsiis.codeplex.com/
设置完成了后,能够用curl
命令验证下是否设置成功。若是出来的结果中含有Strict-Transport-Security
的字段,那么说明设置成功了。
$ curl -I https://www.hi-linux.com HTTP/1.1 200 OK Server: nginx Date: Sat, 27 May 2017 03:52:19 GMT Content-Type: text/html; charset=utf-8 ... Strict-Transport-Security: max-age=63072000; includeSubDomains; preload X-Frame-Options: deny X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff ...
对于HSTS
以及HSTS Preload List
,建议是只要不能确保永远提供HTTPS服务,就不要启用。由于一旦HSTS生效,以前的老用户在max-age
过时前都会重定向到HTTPS,形成网站不能正确访问。惟一的办法是换新域名。
http://www.google.com
http://t.cn/RSzfyBb
https://yuan.ga/hsts-strict-https-enabled-site/
https://imququ.com/post/sth-about-switch-to-https.html
http://www.ttlsa.com/web/hsts-for-nginx-apache-lighttpd/
http://www.jianshu.com/p/66ddc3124006
来源 http://www.tuicool.com/articles/QbYBne
在安装配置 SSL 证书时,可使用一种能使数据传输更加安全的Web安全协议,即在服务器端上开启 HSTS
(HTTP Strict Transport Security)。它告诉浏览器只能经过HTTPS访问,而绝对禁止HTTP方式。
HTTP Strict Transport Security (HSTS) is an opt-in security enhancement that is specified by a web application through the use of a special response header. Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS. It also prevents HTTPS click through prompts on browsers.
可是,在平常开发的过程当中,有时咱们会想测试页面在 HTTP 链接中的表现状况,这时 HSTS 的存在会让调试不能方便的进行下去。并且因为 HSTS 并非像 cookie 同样存放在浏览器缓存里,简单的清空浏览器缓存操做并无什么效果,页面依然经过 HTTPS 的方式传输。 那么怎样才能关闭浏览器的 HSTS 呢,各类谷歌
度娘
以后,在这里汇总一下几大常见浏览器 HSTS 的关闭方法。
~/Library/Cookies/HSTS.plist
这个文件chrome://net-internals/#hsts
Delete domain
中输入项目的域名,并 Delete
删除Query domain
测试是否删除成功和 Chrome 方法同样
about:permissions
Forget About This Site
============================= End