为什么我们要使用HTTP Strict Transport Security?

 

HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式。

0×01. Freebuf百科:什么是Strict-Transport-Security

我摘自owasp上的一段定义:

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.The specification has been released and published end of 2012 as RFC 6797 (HTTP Strict Transport Security (HSTS)) by the IETF. (Reference see in the links at the bottom.)

一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com。这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。

0×02. 我们为什么需要开启Strict-Transport-Security  

想想这样一种场景:

有的网站开启了https,但为了照顾用户的使用体验(因为用户总是很赖的,一般不会主动键入https,而是直接输入域名, 直接输入域名访问,默认就是http访问)同时也支持http访问,当用户http访问的时候,就会返回给用户一个302重定向,重定向到https的地址,然后后续的访问都使用https传输,这种通信模式看起来貌似没有问题,但细致分析,就会发现种通信模式也存在一个风险,那就是这个302重定向可能会被劫持篡改,如果被改成一个恶意的或者钓鱼的https站点,然后,你懂得,一旦落入钓鱼站点,数据还有安全可言吗?

对于篡改302的攻击,建议服务器开启HTTP Strict Transport Security功能,这个功能的含义是:

当用户已经安全的登录开启过htst功能的网站 (支持hsts功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持htst的浏览器(比如chrome. firefox)会自动将这个域名加入到HSTS列表,下次即使用户使用http访问这个网站,支持htst功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到hsts缓存中,然后才会在发送请求前将http内部转换成https),而不是先发送http,然后重定向到https,这样就能避免中途的302重定向URL被篡改。进一步提高通信的安全性。

上面是我自己的理解,下面是owasp中文站点关于hsts的描述:

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

比如,https://example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:

在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求。

在接下来的一年中,如果 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

HSTS可以用来抵御SSL剥离攻击。SSL剥离攻击是中间人攻击的一种,由Moxie Marlinspike于2009年发明。他在当年的黑帽大会上发表的题为“New Tricks For Defeating SSL In Practice”的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入https://,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有https://开头的链接为http://,达到阻止HTTPS的目的。

HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP

另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。

0×03. Strict-Transport-Security的一些不足

用户首次访问某网站是不受HSTS保护的。这是因为首次访问时,浏览器还未收到HSTS,所以仍有可能通过明文HTTP来访问。解决这个不足目前有两种方案,一是浏览器预置HSTS域名列表,Google Chrome、Firefox、Internet Explorer和Spartan实现了这一方案。二是将HSTS信息加入到域名系统记录中。但这需要保证DNS的安全性,也就是需要部署域名系统安全扩展。截至2014年这一方案没有大规模部署。

由于HSTS会在一定时间后失效(有效期由max-age指定),所以浏览器是否强制HSTS策略取决于当前系统时间。部分操作系统经常通过网络时间协议更新系统时间,如Ubuntu每次连接网络时,OS X Lion每隔9分钟会自动连接时间服务器。攻击者可以通过伪造NTP信息,设置错误时间来绕过HSTS。解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。比如Windows 8每7天更新一次时间,并且要求每次NTP设置的时间与当前时间不得超过15小时

0×04. 我的一些测试

1). 测试1

目标域名:portal.fraudmetrix.cn (这个站点不支持hsts功能) 同盾科技的风险控制管理系统(打个软广,同盾科技,基于大数据,专注反欺诈)。

第一次访问:在浏览器地址栏键入:portal.fraudmetrix.cn

可以看到:

这个域名并不在chrome浏览器的hsts的缓存中,也不在hsts中的preload list中(像facebook、twitter等网站已经内置在preload list中,所以每次请求这些站点的时候浏览器都会自动将http 转换成htttps),所以不会在发送请求前将http转换成https请求。

我们来把这个站点手动加入到chrome浏览器的hsts缓存中:

在未清空chrome浏览器历史记录的前提下,我们再次访问这个站点:

可以看到,一个307 响应码,这是chrome浏览器的内部转换,将http转换成https后再发送请求。

备注:为什么我们要求在未清空chrome浏览器的缓存前访问呢?

因为如果清空了chrome浏览器的缓存之后,我们手动加入到hsts缓存中的域名就会被清除,也就不会看到预期的效果了。

2). 测试2

我们先清空chrome浏览器的缓存,然后在浏览器的地址栏中键入 www.alipay.com 

可以看到www.alipay.com(支付宝)这个站点并没有在chrome 浏览器的内置的preload list中,所以第一次访问的时候,chrome浏览器并不会将http转换成https。

而是由前端的F5的负载均衡(BigIP)器将http请求重定向到https请求。

我们继续看看这次请求的其他响应:

可以看到支付宝站点服务器是支持hsts功能的,在其响应头中插入了:Strict-Transport-Security,并且设置这个头部的有效期,只要不手动清空缓存,那么在这个有效期内,chrome浏览器都会将所有发送这个站点的http请求在内部转换成https再发送出去。

浏览器在收到带有Strict-Transport-Security响应头的报文后,就会将这个站点加入到hsts缓存中,下次以http访问的时候就会被自动转换成https。

我们这时查看以下hsts的缓存中是不是有了 www.alipay.com

正如你所见:www.alipay.com已经被加入到了chrome浏览器的缓存中。

这时候在未清空浏览器缓存的前提下再次访问 www.alipay.com 

看到了吧,熟悉的307响应码,浏览器做了内部转换,将http转换成https。

3). 其他 

脸书www.facebook.com是已经加入到chrome浏览器hsts preload list中的。

正在上传…重新上传取消​

注意到没,信息很详细哦!

看看我大百度呢?

清空chrome浏览器缓存,在地址栏键入www.baidu.com:

正在上传…重新上传取消​

正在上传…重新上传取消​

很遗憾,我大百度也不在chrome hsts preload list中。

在看看这次请求中的其他响应报文呢:

正在上传…重新上传取消​

也没有看到 Strict-Transport-Security的影子。

来自:访问的文章审核中... - FreeBuf网络安全行业门户

最后附上chrome的hsts地址:chrome://net-internals/#hsts

然后如何配置HSTS呢?

nginx配置参数:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains" always;

可以参考这篇:

开启HSTS让浏览器强制跳转HTTPS访问 - luckc# - 博客园

开启HSTS让浏览器强制跳转HTTPS访问

在网站全站HTTPS后,如果用户手动敲入网站的HTTP地址,或者从其它地方点击了网站的HTTP链接,通常依赖于服务端301/302跳转才能使用HTTPS服务。而第一次的HTTP请求就有可能被劫持,导致请求无法到达服务器,从而构成HTTPS降级劫持。这个问题目前可以通过HSTS(HTTP Strict Transport Security,RFC6797)来解决。

HSTS简介

HSTS(HTTP Strict Transport Security)是国际互联网工程组织IETF发布的一种互联网安全策略机制。采用HSTS策略的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址,以减少会话劫持风险。

HSTS响应头格式

Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
  • max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。

  • includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过HTTPS协议来访问。

  • preload,可选参数,一个浏览器内置的使用HTTPS的域名列表。

HSTS Preload List

虽然HSTS可以很好的解决HTTPS降级攻击,但是对于HSTS生效前的首次HTTP请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了HSTS Preload List方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用HTTPS协议。

目前这个Preload List由Google Chrome维护,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:

  • 拥有合法的证书(如果使用SHA-1证书,过期时间必须早于2016年);

  • 将所有HTTP流量重定向到HTTPS;

  • 确保所有子域名都启用了HTTPS;

  • 输出HSTS响应头:

  • max-age不能低于18周(10886400秒);

  • 必须指定includeSubdomains参数;

  • 必须指定preload参数;

即便满足了上述所有条件,也不一定能进入HSTS Preload List,更多信息可以查看:https://hstspreload.org/

通过Chrome的chrome://net-internals/#hsts工具,可以查询某个网站是否在Preload List之中,还可以手动把某个域名加到本机Preload List。

HSTS缺点

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浏览器

目前主流浏览器都已经支持HSTS特性,具体可参考下面列表:

  • Google Chrome 4及以上版本

  • Firefox 4及以上版本

  • Opera 12及以上版本

  • Safari从OS X Mavericks起

  • Internet Explorer及以上版本

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攻击。

Apache上启用HSTS

$ 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.comServerAlias 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

Nginx上启用HSTS

$ vim /etc/nginx/conf.d/hi-linux.confserver {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

要在IIS上启用HSTS需要用到第三方模块,具体可参考:https://hstsiis.codeplex.com/

测试设置是否成功

设置完成了后,可以用curl命令验证下是否设置成功。如果出来的结果中含有Strict-Transport-Security的字段,那么说明设置成功了。

$ curl -I https://www.hi-linux.comHTTP/1.1 200 OKServer: nginxDate: Sat, 27 May 2017 03:52:19 GMTContent-Type: text/html; charset=utf-8...Strict-Transport-Security: max-age=63072000; includeSubDomains; preloadX-Frame-Options: denyX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniff...

对于HSTS以及HSTS Preload List,建议是只要不能确保永远提供HTTPS服务,就不要启用。因为一旦HSTS生效,之前的老用户在max-age过期前都会重定向到HTTPS,造成网站不能正确访问。唯一的办法是换新域名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫四(正则表达式)

菜鸟教程 之 python 正则表达式&#xff1a;http://www.runoob.com/python/python-reg-expressions.html python 官网正则文档&#xff1a;https://docs.python.org/2/library/re.html 1、正则表达式 简介 正则表达式 是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好…

量子霸权是个模糊的里程碑

来源&#xff1a;新华网就在人们纷纷猜测谷歌是否会在这场全球科技竞赛中夺魁时&#xff0c;美国斯坦福大学量子物理学家帕特里克海登&#xff18;日对新华社记者提出了一个新颖观点&#xff1a;“量子霸权是个模糊的里程碑。”美国谷歌公司日前发布&#xff17;&#xff12;量…

酸甜八宝粥

用javascript设置和读取cookie的简单例子请看下面用javascript设置和读取cookie的简单例子,现在的问题是,如果要设置的是一个cookie集,比如在cookie1集中有uname,uid两组信息,应该如何写呢? cookie("cookie1")("uname")"testuser"; cookie(&quo…

KMS的几个开源实现汇总

搜索关键词 open source key management server “key management server” ranger kms rotate keys decrypting KMIP 集中密钥工作流程 Centralized Encryption Key Management Server (KMS) | Townsend Security Keywhiz Keywhiz Gitee 极速下载/keywhiz - Gitee.co…

Python 爬虫学习 系列教程

Python爬虫 --- 中高级爬虫学习路线 &#xff1a;https://www.cnblogs.com/Eeyhan/p/14148832.html 看不清图时&#xff0c;可以把图片保存到本地在打开查看。。。 Python爬虫学习系列教程 From&#xff1a;https://cuiqingcai.com/1052.html 一、爬虫入门 1. Python爬虫入门一…

友盟分享小程序_在线学习应用“小打卡”小程序分享

目前疫情导致只能线上开学&#xff0c;多采用微信群或QQ群发布作业、打卡&#xff0c;结合直播平台在线授课。各科老师加入群&#xff0c;打卡及发布的作业、教师辅导信息容易覆盖同时不能记录下来。在以上应用不变的情况下&#xff0c;应用“小打卡”微信小程序可以很好的解决…

LeCun:现在还没有真正的AI系统,机器与生物系统差远了

安妮 编译自 NYU量子位 出品 | 公众号 QbitAI可能我们现在提到的AI都是假AI。近日&#xff0c;Facebook首席人工智能科学家Yann LeCun在纽约大学坦登工程学院的AI研讨会上谈了谈AI的历史和方向。研讨会上&#xff0c;LeCun提出人工神经网络的学习能力仍十分有限&#xff0c;还不…

Java并发编程实战~不安全的单例

不安全的单例 /*** 不安全的单例.<br>* author gqltt<br>* version 1.0.0 2020年4月7日<br>* see * since JDK 1.5.0*/ public class Singleton {// volatile 修饰保证安全.private static Singleton instance null;public static Singleton getInstance()…

于.net开发平台项目案例集锦

订阅 | 上一篇 | 下一篇 五味笔记 于.net开发平台项目案例集锦 作者:henq 日期:2007-09-14字体大小: 小 中 大基于.net开发平台项目案例集锦 经过微软.net Framework 2.0的革新&#xff0c;.net平台的开发越来越精彩。笔者收集基于.net开发的n个项目&#xff0c;一方面为新手提…

增大表名最大长度_风电叶片材料的发展变迁史,及风力发电机叶片长度发展历程...

2020年&#xff0c;能源领域最火的行业是风电&#xff0c;由于中国出台相关文件&#xff0c;截止12月31日为止&#xff0c;之后装机并网的风电机组将不能够获得电价补贴。这个政策直接推动了国内风电市场的短期井喷。当然宏观因素背景是中国对于环保型电力能源的改革步伐在加快…

重磅,Intel考虑收购博通

来源&#xff1a;腾讯科技概要&#xff1a;3月10日消息&#xff0c;据外媒报道&#xff0c;《华尔街日报》援引知情人士的话报道称&#xff0c;英特尔&#xff08;Intel&#xff09;正在考虑一系列收购方案&#xff0c;包括收购芯片制造商博通&#xff08;Broadcom&#xff09;…

Java并发编程实战~volatile

禁用CPU 缓存 告诉编译器&#xff0c;对这个变量的读写&#xff0c;不能使用 CPU 缓存&#xff0c;必须从内存中读取或者写入 /*** TODO 在此写上类的相关说明.<br>* author gqltt<br>* version 1.0.0 2020年4月8日<br>* see * since JDK 1.5.0*/ public c…

如何在SQL Server 2005中还原数据库

还原数据库的方式 有几种数据库备份的方式就将会有几种还原数据库的 方式&#xff1a; l 完整备份的还原&#xff1a;无论是完整备份、差异备份还是事务日志备份的还原&#xff0c;在第一步都要先做完整备份的还原。完整备份的还原只需要还原完整备份文件即可。 l 差异备份的还…

amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境

今天给大家分享一下如何配置java的JDK环境。操作步骤如下&#xff1a;1.下载好 jdk 的安装文件&#xff0c;我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件&#xff1b;2.使用鼠标双击该exe文件&#xff0c;该exe文件会运行安装界面&#xff0c;截图如下&#…

我国医疗机器人产业发展特征分析

来源&#xff1a;雷克世界导语&#xff1a;2016年4月&#xff0c;我国发布了《机器人产业发展规划&#xff08;2016-2020年&#xff09;》&#xff0c;该规划引导我国机器人产业快速健康可持续发展&#xff0c;增强技术创新能力和国际竞争能力&#xff0c;医疗机器人政策长期利…

位枚举(Bit Flags)

场景&#xff1a;如字体&#xff0c;一个字体可以同时拥有枚举里面所列举的一种或者多种风格&#xff0c;这时就需要位枚举 定义&#xff1a; [Flags] publicenumFontStyle { Bold 0x0001, Italic 0x0002, Regular 0x0004, …

华为鸿蒙麒麟玉兔_华为P50除了麒麟9000,还预装鸿蒙系统,比iPhone12值得买

2020年已经临近尾声&#xff0c;各大手机厂商的旗舰机均悉数亮相&#xff0c;消费者的目光也开始逐渐转向2021年的开年旗舰上。而在各大手机厂商的第一批开年旗舰中&#xff0c;华为P系列的新品无疑是最受关注的一款。这主要是因为华为目前仍处于美方制裁下&#xff0c;芯片危机…

2018年智能化发展趋势:语音交互全球开战、AI终端趋势显现

来源&#xff1a;雪球网 作者&#xff1a;西木财经美国知名研究机构CB Insights近日发布重磅报告《2018年必看的人工智能热门趋势》&#xff08;Top AI Trends To Watch In 2018&#xff09;&#xff0c;报告对AI行业发展现状进行了深入研究剖析&#xff0c;并给出了2018年AI…

C++ 对象的内存布局

来源&#xff1a;http://blog.csdn.net/haoel/article/details/3081328 前言 07年12月&#xff0c;我写了一篇《C虚函数表解析》的文章&#xff0c;引起了大家的兴趣。有很多朋友对我的文章留了言&#xff0c;有鼓励我的&#xff0c;有批评我的&#xff0c;还有很多问问题的。…

VB.NET 中的 As New 以及型別指定

常有人以為 VB.NET 程式的執行效能不如 C#&#xff0c;但根據 msdn 的說法&#xff0c;VB.NET 和 C# 都是編譯成 MSIL 中繼語言&#xff0c;因此基本上以二者所寫出來的應用程式也具有相同的效能。最常導致二者在 web 應用程式中&#xff0c;執行效能差異的罪魁禍首&#xff0c…