使用Chrome的chrome ://net-internals/# hsts工具,可以检查某个网站是否位于Preload List中。 您也可以手动将域名添加到本地Preload List中。
HSTS的缺点
HSTS不是劫持HTTP会话的完美解决方案。 用户第一次访问网站不受HSTS保护。 这是因为第一次访问时,浏览器还没有收到HSTS,所以可能可以通过明文HTTP进行访问。
如果用户通过HTTP访问受HSTS保护的网站,则在以下情况下可能会发生降级劫持:
我以前没有访问过这个网站
最近重新安装了操作系统
我最近重新安装了浏览器
切换到新浏览器
切换到手机等新设备
删除浏览器缓存
我最近没有访问过这个车站,max-age过期了
解决这个问题现在有两种方案:
方案1 :
在浏览器中预设HSTS域名列表将导致上述HSTS预加载列表方案。 域名列表已分发到主要的Web浏览器并进行硬编码。 当客户端访问此列表中的域名时,将积极使用HTTPS,并且拒绝对站点的HTTP访问。
方案2 :
将HSTS信息添加到域名系统记录中。 但是,需要确保DNS的安全性。 这意味着需要部署域名系统的安全扩展。
其他问题
由于HSTS将在一段时间后禁用,因此浏览器是否强制实施HSTS策略取决于当前系统时间。 大多数操作系统经常通过网络时间协议更新系统时间。 例如,每当Ubuntu连接到网络时,OS X Lion就会每9分钟自动连接一次时间服务器。 攻击者可以伪造NTP信息,通过设置错误时间绕过HSTS。
解决方法是认证NTP信息,或者禁止NTP大幅增减时间。 例如,Windows 8必须每7天更新一次时间,并为每个NTP设置至少15小时的时间和当前时间。
支持HSTS浏览器
目前,主要浏览器支持HSTS功能。 具体来说,请参照以下列表。
Google Chrome 4及更高版本
Firefox 4或更高版本
Opera 12以上
HSTS部署
要使服务器打开HSTS,请在客户端通过HTTPS发出请求时服务器返回的超文本传输协议响应标头中包括严格传输安全字段。 未加密传输时设置的HSTS字段无效。
最佳部署方案是部署在离用户最近的地方。 例如,体系结构包括前端反向代理和后端Web服务器,最好用前端代理配置HSTS。 否则,必须在Web服务器层配置HSTS。 如果Web服务器不明确支持HSTS,则可以通过添加响应标头机制来解决此问题。 如果其他方法失败,可以将HSTS添加到APP应用层。
启用HSTS相对简单,只需在相应的报头中添加以下信息。
严格传输安全: max-age=63072000; 包括订阅s; 预加载;
严格传输安全是标题字段名,
max-age表示HSTS在客户端上的有效期。
includeSubdomains表示对所有子域名都有效。
preload使用浏览器中的内置域名列表。
HSTS策略只能通过HTTPS响应设置,并且网站必须使用默认的443端口; 必须使用域名,不是IP。 因此,需要将HTTP重定向到HTTPS。 如果明文响应允许设置HSTS标头,则中间人攻击者可以通过将HSTS信息注入普通站点来执行DoS攻击。
在Apache上启用HSTS
$ vim/etc/Apache2/sites-available/hi-Linux.conf
必须启用headers模块才能打开HSTS
load module headers _ module/usr/lib/Apache2/modules/mod _ headers.so
ServerName www.hi-linux.com
ServerAlias hi-linux.com
.
#将所有访问者重定向至HTTPS,解决HSTS的首次访问问题。
redirect permanent/https://www.hi-Linux.com /
.
启用HTTP严格的传输安全
headeralwayssetstrict-transport-security ' max-age=63072000; 包括订阅s; 提前'
.
重新启动Apache服务
$ service apche 2重新开始
在Nginx上启用HSTS
$ vim/etc/nginx/conf.d/hi-Linux.conf
服务器{
listen 443 ssl;
server_name www.hi-linux.com;
add _ header strict-transport-security ' max-age=63072000; 包括订阅s; 预加载';
.
}
服务器{
listen 80
server_name www.hi-linux.com;
return 301https://www.hi-Linux.com $ request _ uri;
.
}
重新启动Nginx服务
$ service nginx重新开始
启用HSTS
要在IIS中启用HSTS,需要第三方模块
测试设置是否成功
设置完成后,可以通过curl命令确认设置是否成功。 如果结果中包含严格传输安全字段,则设置成功。
$ curl -I https://www.hi-linux.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat、27 May 2017 03:52:19 GMT
内容类型: text/html; charset=utf-8
.
严格传输安全: max-age=63072000; 包括订阅s; preload
x-frame-options :达因
X-XSS-Protection: 1; 模式=块
x-content-type-options :否sniff
.
建议不要启用HSTS和HSTS Preload List,除非可以始终提供HTTPS服务。 因为启用HSTS后,以前的旧用户将在max-age过期之前被重定向到HTTPS,从而无法正确访问网站。 唯一的方法是改变域名。