澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:在服务器上配置仅使用H

2019-05-19 作者:澳门新萄京赌场网址   |   浏览(102)

你所不知道的 HSTS

2015/10/24 · HTML5 · HSTS

原文出处: 李靖(@Barret李靖)   

很多人听说过也看到过 301、302,但是几乎从来没有看到过 303 和 307 的状态码。今天在淘宝首页看到了 307 状态码,于是摸索了一把。

最近对我的个人网站启用了Https,所以想设置http默认自动转https访问的功能,但又不想总让服务端做转发操作,那样浪费资源。那么有什么好的办法呢?

HTTP 严格传输安全(HSTS)是一种安全功能,web 服务器通过它来告诉浏览器仅用 HTTPS 来与之通讯,而不是使用 HTTP。本文会说明如何在 Apache2、Nginx 和 Lighttpd 上如何启用 HSTS。在主流的 web 服务器上测试通过: Nginx 1.1.19、 Lighttpd 1.4.28 和 Apache 2.2.22 ,环境为 Ubuntu 12.04、 Debian 6 & 7 和 CentOS 6,只需要调整部分参数就可以工作在其它的发行版上。
什么是 HTTP 严格传输安全?

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

文/马伟

中间人劫持

起因是这样,https 使用的是 443 端口进行数据传输,而浏览器的默认端口是

  1. 劫持者首先劫持用户的 80 端口,当用户向目标页发起请求时,劫持者模拟正常的 https 请求向源服务器获取数据,然后通过 80 端口返回给用户,大概可以看下下面两张图:

澳门新萄京官方网站 1

用户一般不会在地址栏输入   ,而是习惯性输入 taobao.com  ,此时浏览器走的是 http,请求到达服务器之后,服务器告诉浏览器 302 跳转

Location:

1
Location: https://www.taobao.com

然后浏览器重新请求,通过 HTTPS 方式,443 端口通讯。而正因为用户不是直接输入 https:// 链接,劫持者利用这一点:

澳门新萄京官方网站 2

只要能够劫持你的网络,比如路由劫持、DNS劫持,就可以作为中间人注入代码、替换广告。。。(上了 https 也拗不过电信,真是日了够了)

这种劫持出现在两种情况下:

  • 用户没有通过准确的方式访问页面,除非输入 https:// ,否则浏览器默认以 http 方式访问
  • HTTPS 页面的链接中包含 http,这个 http 页面可能被劫持

302跳转

通常将 HTTP 请求 302 跳转到 HTTPS,但有问题:

1.不安全,302 跳转会暴露用户访问站点,易被劫持。

2.多增加一次访问,使得客户端响应速度慢。302 跳转需要一个 RTT(The role of packet loss and round-trip time),浏览器执行跳转也需要时间。

引用自 Mozilla Developer Network:

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

缘起:启用HTTPS也不够安全

有不少网站只通过HTTPS对外提供服务,但用户在访问某个网站的时候,在浏览器里却往往直接输入网站域名(例如www.example.com),而不是完整的URL(例如https://www.example.com),不过浏览器依然能正确的使用HTTPS发起请求。这背后多亏了服务器和浏览器的协作,如下图所示。

图1:服务器和浏览器在背后帮用户做了很多工作

简单来讲就是,浏览器向网站发起一次HTTP请求,在得到一个重定向响应后,发起一次HTTPS请求并得到最终的响应内容。所有的这一切对用户而言是完全透明的,所以在用户看来,在浏览器里直接输入域名却依然可以用HTTPS协议和网站进行安全的通信,是个不错的用户体验。

一切看上去都是那么的完美,但其实不然,由于在建立起HTTPS连接之前存在一次明文的HTTP请求和重定向(上图中的第1、2步),使得攻击者可以以中间人的方式劫持这次请求,从而进行后续的攻击,例如窃听数据、篡改请求和响应、跳转到钓鱼网站等。

以劫持请求并跳转到钓鱼网站为例,其大致做法如下图所示:

图2:劫持HTTP请求,阻止HTTPS连接,并进行钓鱼攻击

  • 第1步:浏览器发起一次明文HTTP请求,但实际上会被攻击者拦截下来
  • 第2步:攻击者作为代理,把当前请求转发给钓鱼网站
  • 第3步:钓鱼网站返回假冒的网页内容
  • 第4步:攻击者把假冒的网页内容返回给浏览器

这个攻击的精妙之处在于,攻击者直接劫持了HTTP请求,并返回了内容给浏览器,根本不给浏览器同真实网站建立HTTPS连接的机会,因此浏览器会误以为真实网站通过HTTP对外提供服务,自然也就不会向用户报告当前的连接不安全。于是乎攻击者几乎可以神不知鬼不觉的对请求和响应动手脚。

启用 HSTS

HSTS,HTTP Strict Transport Security,简单说就是强制客户端使用 HTTPS 访问页面。其原理就是:

  • 在服务器响应头中添加  Strict-Transport-Security ,可以设置  max-age
  • 用户访问时,服务器种下这个头
  • 下次如果使用 http 访问,只要 max-age 未过期,客户端会进行内部跳转,可以看到 307 Redirect Internel 的响应码
  • 变成 https 访问源服务器

这个过程有效避免了中间人对 80 端口的劫持。但是这里存在一个问题:如果用户在劫持状态,并且没有访问过源服务器,那么源服务器是没有办法给客户端种下 Strict-Transport-Security  响应头的(都被中间人挡下来了)。

启用 HSTS 不仅仅可以有效防范中间人攻击,同时也为浏览器节省来一次 302/301 的跳转请求,收益还是很高的。我们的很多页面,难以避免地出现 http 的链接,比如 help 中的链接、运营填写的链接等,这些链接的请求都会经历一次 302,对于用户也是一样,收藏夹中的链接保存的可能也是 http 的。

HSTS

302 跳转是由浏览器触发的,服务器无法完全控制,这个需求导致了 HSTS(HTTP Strict Transport Security)的诞生。HTSP 就是添加 header 头(add_header Strict-Transport-Security max-age=15768000;includeSubDomains),告诉浏览器网站使用 HTTPS 访问,支持HSTS的浏览器就会在后面的请求中直接切换到 HTTPS。在 Chrome 中会看到浏览器自己会有个 307 Internal Redirect 的内部重定向。在一段时间内也就是max-age定义的时间,不管用户输入 www.liberalman.cn 还是 http://www.liberalman.cn ,都会默认将请求内部跳转到https://www.liberalman.cn 。

采用HSTS协议的网站将保证浏览器始终连接到该网站的HTTPS加密版本,不需要用户手动在URL地址栏中输入加密地址。

该协议将帮助网站采用全局加密,用户看到的就是该网站的安全版本。

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

比如,https://www.liberalman.cn 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:
在接下来的一年(即31536000秒)中,浏览器只要向xxx或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://www.liberalman.cn/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.liberalman.cn/ 发送请求。

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

服务器端配置HSTS,减少302跳转,其实HSTS的最大作用是防止302 HTTP劫持。HSTS的缺点是浏览器支持率不高,另外配置HSTS后HTTPS很难实时降级成HTTP。同时,也建议启用SPDY来提高性能,不累述。

  •     如果一个 web 服务器支持 HTTP 访问,并将其重定向到 HTTPS 访问的话,那么访问者在重定向前的初始会话是非加密的。举个例子,比如访问者输入 或直接输入 foo.com 时。
  •     这就给了中间人攻击的一个机会,重定向可能会被破坏,从而定向到一个恶意站点而不是应该访问的加密页面。
  •     HTTP 严格传输安全(HSTS)功能使 Web 服务器告知浏览器绝不使用 HTTP 访问,在浏览器端自动将所有到该站点的 HTTP 访问替换为 HTTPS 访问。

一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入 Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求。

解决之道:使用HSTS

既然建立HTTPS连接之前的这一次HTTP明文请求和重定向有可能被攻击者劫持,那么解决这一问题的思路自然就变成了如何避免出现这样的HTTP请求。我们期望的浏览器行为是,当用户让浏览器发起HTTP请求的时候,浏览器将其转换为HTTPS请求,直接略过上述的HTTP请求和重定向,从而使得中间人攻击失效,以规避风险。其大致流程如下:

图3:略过HTTP请求和重定向,直接发送HTTPS请求

  • 第1步:用户在浏览器地址栏里输入网站域名,浏览器得知该域名应该使用HTTPS进行通信
  • 第2步:浏览器直接向网站发起HTTPS请求
  • 第3步:网站返回相应的内容

那么问题来了,浏览器是如何做到这一点的呢?它怎么知道哪个网站应该发HTTPS请求,哪个网站应该用HTTP请求呢?此时就该HSTS闪亮登场了。

307 状态码

在 GET、HEAD 这些幂等的请求方式上,302、303、307 没啥区别,而对于 POST 就不同了,大部分浏览器 都会302 会将 POST 请求转为 GET,而 303 是规范强制规定将 POST 转为 GET 请求,请求地址为 header 头中的 Location,307 则不一样,规范要求浏览器继续向 Location 的地址 POST 内容。

而在 HSTS 中,307 可以被缓存,缓存时间根据 max-age 而定,一般建议缓存 1 年甚至更长。

nginx如何配置HSTS

在nginx的配置中,在https的server站点添加如下头部:

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

这样当第一次以https方式访问我的网站,nginx则会告知客户端的浏览器,以后即便地址栏输入http,也要浏览器改成https来访问我的nginx服务器。是不是很爽,服务器再也不管http转发到https这档子事了,由浏览器自己把http改名字为https再来请求服务器,这不就减少了访问服务器的次数了吗,节省了不少资源。

实测效果,重启nginx后,第一次访问用了http,发现没有跳转。当然不跳了,人家HSTS生效是要你访问https才生效的。然后输入了https的网址,下来再重新输入http,神奇了,真的浏览器自己替换成了https,再试试依然会替换,看我的配置,大概会维持63072000s吧,哈哈。

如果用户第一次访问是http,以后还是http,就是不用一次https,那我们岂不是一直不能是的HSTS生效了?所以这里再加个配置,在http站点的server下,添加配置

return 301 https://$host;

这样当客户端访问http的时候,nginx就给他转到https上去,那访问了一次https后,以后浏览器自己就往https上转了,发到nginx的也就是https的请求了!

另外如果为了避免点击劫持,还要添加 X-Frame-Options 头部,确保不会嵌入到frame 或 iframe,使得网站的内容不会嵌入到其他网站。

add_header X-Frame-Options "DENY";

以下引自维基百科:

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

HSTS

HSTS的全称是HTTP Strict-Transport-Security,它是一个Web安全策略机制(web security policy mechanism)。

HSTS最早于2015年被纳入到ThoughtWorks技术雷达,并且在2016年的最新一期技术雷达里,它直接从“评估(Trial)”阶段进入到了“采用(Adopt)“阶段,这意味着ThoughtWorks强烈主张业界积极采用这项安全防御措施,并且ThoughtWorks已经将其应用于自己的项目。

HSTS最为核心的是一个HTTP响应头(HTTP Response Header)。正是它可以让浏览器得知,在接下来的一段时间内,当前域名只能通过HTTPS进行访问,并且在浏览器发现当前连接不安全的情况下,强制拒绝用户的后续访问要求。

HSTS Header的语法如下:

Strict-Transport-Security: <max-age=>[; includeSubDomains][; preload]

其中:

  • max-age是必选参数,是一个以秒为单位的数值,它代表着HSTS Header的过期时间,通常设置为1年,即31536000秒。
  • includeSubDomains是可选参数,如果包含它,则意味着当前域名及其子域名均开启HSTS保护。
  • preload是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要使用到它。关于浏览器内置列表,下文有详细介绍。

HSTS 存在的坑

  • 纯 IP 的请求,HSTS 没法处理,比如 http://2.2.2.2 , 即便响应头中设置了 STS,浏览器也不会理会(未测试)
  • HSTS 只能在 80 和 443 端口之间切换,如果服务是 8080 端口,即便设置了 STS,也无效(未测试)
  • 如果浏览器证书错误,一般情况会提醒存在安全风险,然是依然给一个链接进入目标页,而 HSTS 则没有目标页入口,所以一旦证书配置错误,就是很大的故障了
  • 如果服务器的 HTTPS 没有配置好就开启了 STS 的响应头,并且还设置了很长的过期时间,那么在你服务器 HTTPS 配置好之前,用户都是没办法连接到你的服务器的,除非 max-age 过期了。
  • HSTS 能让你的网站在 ssllab 上到 A (这不是坑)

浏览器支持

Chromium和Google Chrome从4.0.211.0版本开始支持HSTS

Firefox 4及以上版本

Opera 12及以上版本

Safari从OS X Mavericks起

Internet Explorer从Windows 10技术预览版开始支持,之后微软又向IE11用户推送了支持HSTS的更新。

    HSTS 可以用来抵御 SSL 剥离攻击。SSL 剥离攻击是中间人攻击的一种,由 Moxie Marlinspike 于2009年发明。他在当年的黑帽大会上发表的题为 “New Tricks For Defeating SSL In Practice” 的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入

想想这样一种场景:

让浏览器直接发起HTTPS请求

只要在服务器返回给浏览器的响应头中,增加Strict-Transport-Security这个HTTP Header(下文简称HSTS Header),例如:

Strict-Transport-Security: max-age=31536000; includeSubDomains

就可以告诉浏览器,在接下来的31536000秒(1年)内,对于当前域名及其子域名的后续通信应该强制性的只使用HTTPS,直到超过有效期为止。

完整的流程如下图所示:

图4:完整的HSTS流程

只要是在有效期内,浏览器都将直接强制性的发起HTTPS请求,但是问题又来了,有效期过了怎么办?其实不用为此过多担心,因为HSTS Header存在于每个响应中,随着用户和网站的交互,这个有效时间时刻都在刷新,再加上有效期通常都被设置成了1年,所以只要用户的前后两次请求之间的时间间隔没有超过1年,则基本上不会出现安全风险。更何况,就算超过了有效期,只要用户和网站再进行一次新的交互,用户的浏览器又将开启有效期为1年的HSTS保护。

小结

本文简单说明了 HSTS 的基本原理和相关内容,他在全站 https 下有一个较大的正向作用,推荐使用。

P.S:在 Chrome 中打开 chrome://net-internals/#hsts,添加域名之后,可以让浏览器强制对该域名启用 https,所有的 http 请求都会内部转到 https。

1 赞 收藏 评论

澳门新萄京官方网站 3

缺点

HSTS并不是HTTP会话劫持的完美解决方案。用户首次访问某网站是不受HSTS保护的。这是因为首次访问时,浏览器还未收到HSTS,所以仍有可能通过明文HTTP来访问。如果他们通过HTTP访问HSTS保护的网站时:

  • 以前从未访问过该网站
  • 最近重新安装了其操作系统
  • 最近重新安装了其浏览器
  • 切换到新的浏览器
  • 切换到一个新的设备如移动电话
  • 删除浏览器的缓存
  • 最近没访问过该站并且max-age过期了

解决这个不足目前有两种方案

一是浏览器预置HSTS域名列表,Google Chrome、Firefox、Internet Explorer和Spartan实现了这一方案。google坚持维护了一个“HSTS preload list”的站点域名和子域名,并通过https://hstspreload.appspot.com/提交其域名。该域名列表被分发和硬编码到主流的web浏览器。客户端访问此列表中的域名将主动的使用HTTPS,并拒绝使用HTTP访问该站点。
一旦设置了STS头部或者提交了你的域名到HSTS预加载列表,这是不可能将其删除的。这是一个单向的决定使你的域名通过HTTPS可用的。

二是将HSTS信息加入到域名系统记录中。但这需要保证DNS的安全性,也就是需要部署域名系统安全扩展。截至2014年这一方案没有大规模部署。

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


创建于 2017-05-18 成都,更新于 2017-05-18 成都

该文章在以下平台同步

  • LIBERALMAN: https://www.liberalman.cn/article/91
  • CSDN: http://blog.csdn.net/socho/article/details/72456008
  • 简书:
  • [1] 引用

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

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

澳门新萄京官方网站,强制拒绝不安全的链接,不给用户选择的机会

在没有HSTS保护的情况下,当浏览器发现当前网站的证书出现错误,或者浏览器和服务器之间的通信不安全,无法建立HTTPS连接的时候,浏览器通常会警告用户,但是却又允许用户继续不安全的访问。如下图所示,用户可以点击图中红色方框中的链接,继续在不安全的连接下进行访问。

图5:浏览器依然允许用户进行不安全的访问

理论上而言,用户看到这个警告之后就应该提高警惕,意识到自己和网站之间的通信不安全,可能被劫持也可能被窃听,如果访问的恰好是银行、金融类网站的话后果更是不堪设想,理应终止后续操作。然而现实很残酷,就我的实际观察来看,有不少用户在遇到这样的警告之后依然选择了继续访问。

不过随着HSTS的出现,事情有了转机。对于启用了浏览器HSTS保护的网站,如果浏览器发现当前连接不安全,它将仅仅警告用户,而不再给用户提供是否继续访问的选择,从而避免后续安全问题的发生。例如,当访问Google搜索引擎的时候,如果当前通信连接存在安全问题,浏览器将会彻底阻止用户继续访问Google,如下图所示。

图6:浏览器彻底阻止用户继续进行不安全的访问

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

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

道高一尺魔高一丈:攻击者依然有可乘之机

细心的你可能发现了,HSTS存在一个比较薄弱的环节,那就是浏览器没有当前网站的HSTS信息的时候,或者第一次访问网站的时候,依然需要一次明文的HTTP请求和重定向才能切换到HTTPS,以及刷新HSTS信息。而就是这么一瞬间却给攻击者留下了可乘之机,使得他们可以把这一次的HTTP请求劫持下来,继续中间人攻击。

场景举例:

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

Preload List:让防御更加彻底

针对上面的攻击,HSTS也有应对办法,那就是在浏览器里内置一个列表,只要是在这个列表里的域名,无论何时、何种情况,浏览器都只使用HTTPS发起连接。这个列表由Google Chromium维护,FireFox、Safari、IE等主流浏览器均在使用。

    当你通过一个无线路由器的免费 WiFi 访问你的网银时,很不幸的,这个免费 WiFi 也许就是由黑客的笔记本所提供的,他们会劫持你的原始请求,并将其重定向到克隆的网银站点,然后,你的所有的隐私数据都曝光在黑客眼下。

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

一些Tips

Tip 1:如何配置HSTS

很多地方都可以进行HSTS的配置,例如反向代理服务器、应用服务器、应用程序框架,以及应用程序中自定义Header。你可以根据实际情况进行选择。
常见的是在代理服务器中进行配置,以Nginx为例,只需在配置文件中加上下面这条指令即可:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

不过需要特别注意的是,在生产环境下使用HSTS应当特别谨慎,因为一旦浏览器接收到HSTS Header(假如有效期是1年),但是网站的证书又恰好出了问题,那么用户将在接下来的1年时间内都无法访问到你的网站,直到证书错误被修复,或者用户主动清除浏览器缓存。

因此,建议在生产环境开启HSTS的时候,先将max-age的值设置小一些,例如5分钟,然后检查HSTS是否能正常工作,网站能否正常访问,之后再逐步将时间延长,例如1周、1个月,并在这个时间范围内继续检查HSTS是否正常工作,最后才改到1年。

Tip 2:如何加入到HSTS Preload List

根据官方说明,你的网站在具备以下几个条件后,可以提出申请加入到这个列表里。

  • 具备一个有效的证书

  • 在同一台主机上提供重定向响应,以及接收重定向过来的HTTPS请求

  • 所有子域名均使用HTTPS

  • 在根域名的HTTP响应头中,加入HSTS Header,并满足下列条件:

  • 过期时间最短不得少于18周(10886400秒)

  • 必须包含includeSubDomains参数

  • 必须包含preload参数
    当你准好这些之后,可以在HSTS Preload List的官网上(https://hstspreload.org)提交申请,或者了解更多详细的内容。

Tip 3:如何查询域名是否加入到了Preload List

从提交申请到完成审核,成功加入到内置列表,中间可能需要等待几天到几周不等的时间。可通过官网https://hstspreload.org或在Chrome地址栏里输入chrome://net-internals/#hsts查询状态。

    严格传输安全可以解决这个问题。如果你之前使用 HTTPS 访问过你的网银,而且网银的站点支持 HSTS,那么你的浏览器就知道应该只使用 HTTPS,无论你是否输入了 HTTPS。这样就防范了中间人劫持攻击。

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

总结

随着越来越多的网站开始使用HTTPS,甚至是开启全站HTTPS,数据在传输过程中的安全性能够得到极大的保障。与此同时,通过HSTS的帮助,避免遭受到SSL Stripping或者中间人的攻击,能够使得数据通信变得更加安全。本篇文章希望通过对HSTS的解析,使得更多的开发团队将HSTS运用到自己的项目中。


更多精彩洞见,请关注微信公众号:思特沃克

注意,如果你之前没有使用 HTTPS 访问过该站点,那么 HSTS 是不奏效的。网站需要通过 HTTPS 协议告诉你的浏览器它支持 HSTS。

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

服务器开启 HSTS 的方法是,当客户端通过HTTPS发出请求时,在服务器返回的 HTTP 响应头中包含 Strict-Transport-Security 字段。非加密传输时设置的HSTS字段无效。
在 Apache2 中设置 HSTS

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

编辑你的 apache 配置文件(如 /etc/apache2/sites-enabled/website.conf 和 /etc/apache2/httpd.conf ),并加以下行到你的 HTTPS VirtualHost:

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

  

HSTS可以用来抵御SSL剥离攻击。SSL剥离攻击是中间人攻击的一种,由Moxie Marlinspike于2009年发明。他在当年的黑帽大会上发表的题为“New Tricks For Defeating SSL In Practice”的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入

复制代码 代码如下:

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

  # Optionally load the headers module:
    LoadModule headers_module modules/mod_headers.so
    <VirtualHost 67.89.123.45:443>
        Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
    </VirtualHost>

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

现在你的 web 站点在每次访问时都会发送该请求头,失效时间是两年(秒数)。这个失效时间每次都会设置为两年后,所以,明天你访问时,它会设置为明天的两年后。

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

你只能在 HTTPS 虚拟机中设置这个头,而不能设置在 HTTP 虚拟机中。

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

澳门新萄京官方网站:在服务器上配置仅使用HTTPS通信的教程,你所不知道的。要将你的访问者重定向到对应 HTTPS 站点,可使用如下设置:

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

  

复制代码 代码如下:

解决方案:服务器开启 HTTP Strict Transport Security 功能

  <VirtualHost *澳门新萄京官方网站:在服务器上配置仅使用HTTPS通信的教程,你所不知道的。:80>
      [...]
      ServerName example.com
      Redirect permanent /
    </VirtualHost>

1). apache2 中配置 HTTP Strict Transport Security

如果仅仅是做重定向的话,甚至不需要设置 DocumentRoot。

首先启用apache2的header 模块

你也可以使用 mod_rewrite 来做重定向,但是上述的方式更简单更安全。不过,mod_rewrite 可以重定向页面到对应的 HTTPS 页面,而上述配置则只重定向到“/”:

其次在虚拟主机配置中加入

   

Header always set Strict‐Transport‐Security "max‐age=63072000; includeSubDomains"`

复制代码 代码如下:

max‐age:设置hsts的有效期,在这个有效期内,http访问域名都会自动内部转换成https

<VirtualHost *:80>
      [...]
      <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*)
      </IfModule>
    </VirtualHost>

includeSubDomains :表示对子域名也生效

不要忘记重启 Apache。
Lighttpd

最后重启apache2

对于 lighttpd 来说很简单,将下述配置增加到你的 Lighttpd 配置文件(例如:/etc/lighttpd/lighttpd.conf):

配置案例1:

   

Header always set Strict‐Transport‐Security "max‐age=63072000; includeSubDomains"

复制代码 代码如下:

访问http的都重定向到https

server.modules = ( "mod_setenv" )
    $HTTP["scheme"] == "https" {
        setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
    }

通过重定向方式:

重启 Lighttpd。失效时间也是两年。
Nginx

[...]

Nginx 甚至更简单,将下述行添加到你的 HTTPS 配置的 server 块中:

ServerName example.com

   

Redirect permanent /

复制代码 代码如下:

通过重写方式:

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

[...]

不要忘记重启 Nginx。

RewriteEngine On

您可能感兴趣的文章:

  • 结合Python的SimpleHTTPServer源码来解析socket通信
  • 浅析Android系统中HTTPS通信的实现
  • CentOS7 配置Nginx支持HTTPS访问的实现方案
  • JAVA利用HttpClient进行POST请求(HTTPS)实例
  • 微信小程序 后台https域名绑定和免费的https证书申请详解
  • Node.js开启Https的实践详解
  • Linux下nginx配置https协议访问的方法
  • ASP.NET Core 1.0 部署 HTTPS(.NET Core 1.0)
  • IIS7/IIS7.5 URL 重写 HTTP 重定向到 HTTPS的方法
  • HTTPS 通信原理及详细介绍

RewriteCond %{HTTPS} off

RewriteRule (.*)

配置案例2:

在http 和https 虚拟主机中都加入

Header always set Strict‐Transport‐Security "max‐age=63072000; includeSubDomains"

2). nginx 中配置 HTTP Strict Transport Security

配置思路和apache2一样,不过配置命令为

add_header Strict‐Transport‐Security max‐age=63072000;

原文:

本文由澳门新萄京官方网站发布于澳门新萄京赌场网址,转载请注明出处:澳门新萄京官方网站:在服务器上配置仅使用H

关键词: