• 售前

  • 售后

热门帖子
入门百科

nginx开启HSTS让欣赏器强制跳转HTTPS访问详解

[复制链接]
飞一航符cx 显示全部楼层 发表于 2021-10-26 13:32:42 |阅读模式 打印 上一主题 下一主题
在上一篇文章中我们已经实现了当地node服务利用https访问了,看上一篇文章效果可以看如下:

但是如果我们如今利用http来访问的话,访问不了。如下图所示:

因此我如今起首要做的是利用nginx设置下,当用户在浏览器下输入http哀求的时候利用nginx重定向到https下即可。因此我们如今需要做一个简单的nginx重定向功能。
因此在我们的nginx中需要加如下重定向设置:
  1. server {
  2. listen xxx.abc.com;
  3. server_name xxx.abc.com;
  4. rewrite ^/(.*)$ https://$host$1 permanent;
  5. }
复制代码
因此nginx紧张的设置代码如下:
  1. server {
  2. listen xxx.abc.com;
  3. server_name xxx.abc.com;
  4. rewrite ^/(.*)$ https://$host$1 permanent;
  5. }server { listen  443 ssl; server_name xxx.abc.com; ssl_certificate  cert/server.crt; ssl_certificate_key cert/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:3001; }}
复制代码
如上设置后,我们需要重新启动下nginx即可收效,我们在浏览器下输入域名 http://xxx.abc.com 后 会自动重定向到 https://xxx.abc.com/ 了,我们再来看下 我们网络上的哀求有2个哀求,如下所示:


如上哀求可以看到,浏览器起首会向网站发起一次http哀求(http://xxx.abc.com), 在得到一个重定向相应后,再会发起一次https哀求并得到最终的相应内容。对用户来讲,它的利用是透明的,用户体验也是不错的,但是在https链接之前会存在一次明文的http哀求和重定向。那么攻击者可以以中间人的方式劫持http哀求。来进行后续的攻击。比如窃听数据。篡改哀求或相应、跳转到垂纶网站等利用。因此http哀求是不敷安全的,所以近来几年所有的网站都要以https来访问的。
那么以劫持http哀求并跳转到垂纶网站类为列子,来看看大抵的劫持流程是如下这个样子的。

利用步调如下:
1. 浏览器会发起一次http哀求(比如http://xxx.abc.com). 发出哀求后,攻击者会以中间人的身份来劫持该http哀求。
2. 攻击者劫持该http哀求后,会把当前哀求转发给垂纶网站(比如 http://xxx.yyy.com)。
3. 垂纶网站会返回假冒的网页内容。
4. 末了攻击者把假冒的网页内容返回给浏览器。
如上http哀求根本就没有重定向到https网站到,而是攻击者直接劫持了http哀求,最终把垂纶网站返回给浏览器了。因此如果直接http重定向的话,会存在一次http哀求明文的问题,因此直接利用http重定向是不安全的,因此就出现了HSTS来办理这个问题。下面我们来认识下HSTS吧。
2. 认识下HSTS
如上利用重定向的方式,把http重定向到https存在安全性问题,由于在重定向https之前会存在一次http明文的哀求,那么攻击者很容易劫持http哀求,因此如今我们想当用户浏览器发起http哀求的时候,浏览器直接转换成https哀求。然后通过https哀求页面,如许的话,攻击者就一般很难进行攻击了。我们可以请看如下表示图,如下所示:


步调可以明白为如下:
1. 用户在浏览器输入 http://xxx.abc.com 的时候,浏览器知道该域名需要利用https来进行通讯。
2. 因此浏览器直接向网站发起https哀求(比如https://xxx.abc.com) 如许的。
3. 网站返回相应的内容。
那么如今的问题就是说,浏览器怎么知道该域名需要利用https呢?因此这个时候我们出现了HSTS了。
HSTS是啥?
HSTS的全称是 HTTP Strict-Transport-Security. 它是国际互联网工程组织IETF发布的一种互联网安全战略机制。采用HSTS战略的网站将包管浏览器始终链接到该网站的https加密版本。不需要用户手动在URI地址栏中输入加密地址,来镌汰会话被劫持的风险。
HSTS的基本语法如下:
  1. Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
复制代码
max-age 是必须的参数,它是一个以秒为单位的数值,它代表着HSTS Header的逾期时间,一般设置为1年,即 31536000秒。
includeSubDomains 是可选参数,如果设置该参数的话,那么意味着当前域名及其子域名均开启HSTS的掩护。
preload是可选参数,只有当你申请将自己的域名加入到浏览器内置列表的时候才需要利用到它。
下面我们先来看下百度的也是如许处理惩罚的,我们先在浏览器URI输入 http://www.baidu.com/ 后回车,浏览器会自动转化成 https://www.baidu.com/ 如许的哀求了,但是我们利用chrome浏览器看网络下的哀求可以看到如下会发送2次哀求,如下所示:


第二次是https哀求,如下所示:

我们可以看到如上,第一次哀求状态码是307,而且哀求头有如许的标识 "Provisional headers are shown", 详细的寄义可以明白为浏览器拦截了该哀求,而且该哀求并没有发送出去。因此浏览器发现该域名需要利用https来哀求,所以就发了第二次https哀求了。
nginx下设置HSTS
在nginx设置文件上设置HSTS相应头部,代码如下:
  1. add_header Strict-Transport-Security "max-age=172800; includeSubDomains"
复制代码
因此nginx的设置如下:
  1. server {
  2. listen xxx.abc.com;
  3. server_name xxx.abc.com;
  4. rewrite ^/(.*)$ https://$host$1 permanent;
  5. }server { listen  443 ssl; server_name xxx.abc.com; add_header Strict-Transport-Security "max-age=172800; includeSubDomains"; ssl_certificate  cert/server.crt; ssl_certificate_key cert/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:3001; }}
复制代码
然后nginx设置生存,然后重启。
当我重启后,第一次利用https方式访问我的网站,nginx会告诉客户端浏览器,以后如果用户输入的是http,也要让浏览器以https来访问我的nginx服务器,如下所示:



但是如果nginx重启后,第一次利用http访问的话,虽然跳转了,但是并没有利用HSTS了,由于要跳转到https,才会利用HSTS。但是当我再输入http了就会有307状态码,而且有 "Provisional headers are shown" 如许的提示。
明白HSTS Preload List
HSTS虽然可以办理HTTPS的降级攻击,但是对于HSTS收效前初次的http哀求,依然是无法避免http哀求被劫持的问题,比如我们第一次浏览器清除缓存,然后第一次利用http哀求的话,第一次http也是明文传输的,当跳转到https后会利用HSTS的,以后只要浏览器缓存不清除的话,nginx不重启的话,都会利用HSTS掩护的。因此为相识决第一次http哀求的问题,浏览器厂商们为相识决这个问题,提出了 HSTS Preload List 的方案,内置一份可以定期更新的表,对于列表中的域名,纵然用户之前没有访问过,也会利用https协议哀求的。
如今这个Preload List由Google Chrome维护,Chrome、Firefox、Safari、IE 11和Microsoft Edge都在利用。如果要想把自己的域名加进这个列表,起首需要满意以下条件:
1. 拥有正当的证书(如果利用SHA-1证书,逾期时间必须早于2016年);
2. 将所有HTTP流量重定向到HTTPS;
3. 确保所有子域名都启用了HTTPS;
4. 输出HSTS相应头:
5. max-age不能低于18周(10886400秒);
6. 必须指定includeSubdomains参数;
7. 必须指定preload参数;
即便满意了上述所有条件,也不肯定能进入HSTS Preload List,更多信息可以查察:https://hstspreload.org/。
通过Chrome的chrome://net-internals/#hsts工具,可以查询某个网站是否在PreloadList之中,还可以手动把某个域名加到本机Preload List。
HSTS缺点
HSTS并不是HTTP会话劫持的完美办理方案。用户初次访问某网站是不受HSTS掩护的。这是由于初次访问时,浏览器还未收到HSTS,所以仍有大概通过明文HTTP来访问。
如果用户通过HTTP访问HSTS掩护的网站时,以下几种情况存在降级劫持大概:
1. 从前从未访问过该网站。
2. 近来重新安装了其利用系统。
3. 近来重新安装了其浏览器。
4. 切换到新的浏览器。
5. 删除浏览器的缓存。
6. 近来没访问过该站而且max-age逾期了。
那么办理该问题的方法,可以利用上面介绍的 HSTS Preload List 方法。
支持HSTS浏览器
如今主流浏览器都已经支持HSTS特性,详细可参考下面列表:
Google Chrome 4及以上版本
Firefox 4及以上版本
Opera 12及以上版本
Safari从OS X Mavericks起
Internet Explorer及以上版本
以上就是本文的全部内容,希望对大家的学习有所资助,也希望大家多多支持草根技术分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作