首页 > 系统 > Linux > 正文
nginx启用HSTS以支持从http到https不通过服务端而自动跳转
2017-05-19       个评论    来源:socho的专栏  
收藏    我要投稿

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

302跳转

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

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

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

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来提高性能,不累述。

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吧,哈哈。

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

add_header X-Frame-Options "DENY";

浏览器支持

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

Firefox 4及以上版本

Opera 12及以上版本

Safari从OS X Mavericks起

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

缺点

用户首次访问某网站是不受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小时。

点击复制链接 与好友分享!回本站首页
上一篇:ubnt路由器 switch0 和 br0的区别
下一篇:Shell常用语法归集
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站