技术控

    今日:28| 主题:49448
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] ???? 也谈 HTTPS - HTTPDNS + HTTPS

[复制链接]
祝你爆炸 发表于 2016-12-1 05:02:03
20 2

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

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

x
最近谈论 HTTPS 的文章很多,其原因之一是运营商作恶底线越来越低,动不动就插播广告, 前两天小米还联合几家公司发文 关于抵制流量劫持等违法行为的联合声明 痛斥某些运营商。 另一方面也是苹果 ATS 政策的大力推动,逼迫大家在 APP 中全部使用 HTTPS 通信。 上 HTTPS 的好处很多:保护用户的数据不外泄,避免中间人篡改数据, 对企业信息进行鉴权。
   
???? 也谈 HTTPS - HTTPDNS + HTTPS-1 (违法行为,服务器,运营商,中间人,文章)

  关于 HTTPS 如何购买证书,如何部署,网上的教程已经太多了,实践起来没有太大的难处。 我们在部署 HTTPS 的时候,遇到了一些新问题,首当其冲的就是 HTTPS 部分网络不可访问的问题:
  尽管使用了 HTTPS 技术,部分邪恶的运营商,仍然使用 DNS 污染技术,让域名指向的他们自己服务器 而这些服务器并没有部署 SSL 服务(就算部署了,也会触发 SSL 证书 Common name 不一致报警), 导致 443 端口直接被拒绝。
  这个问题不解决,强行上 HTTPS 的话,会导致一部分用户出现无法访问网站 一旦用户不爽了,轻则对产品不信任,重则直接导致用户流失。
  运营商为了赚广告钱、省网间结算是不择手段的。 他们普遍使用的劫持手段是通过 ISP提供的 DNS 伪造域名。 那有没有什么方法可以解决 DNS 劫持呢? 业界有一套解决这类场景的方案,即 HTTPDNS。
  HTTPDNS 的原理很简单,将 DNS 这种容易被劫持的协议,转为使用 HTTP 协议请求 Domain <-> IP 映射。 获得正确 IP 之后,Client 自己组装 HTTP 协议,从而避免 ISP 篡改数据。
  有两篇文章很清晰的讲解了 HTTPDNS 的细节:
  
       
  • 【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解
           
    • 腾讯这篇文章时间点是 2014 年,说明这个方案上线更早,也较为成熟   
       
  • DNS-over-HTTPS  |  Public DNS  |  Google Developers
           
    • 该方案更为先进,使用 HTTP 替换为 HTTPS,减少一个隐患点   
       


???? 也谈 HTTPS - HTTPDNS + HTTPS-2 (违法行为,服务器,运营商,中间人,文章)

   点击 https://dns.google.com/resolve?name=www.duitang.com / http://119.29.29.29/d?dn=www.duitang.com 感受一下 DNS-over-HTTPS / HTTPDNS。
  单 IP 多域名支持

  这个方案看似完美,但是在实际生产中,会遇到一个问题。
  Android / iOS 在操作系统级别对 HTTPS 通信是提供了封装。 APP 无法在发起连接时候,也没有权限直接操作 socket。 所以尽管 APP 拿到了域名对应的 IP,却没有办法让这个 IP 在 HTTPS 里生效。
   解决的思路很暴力: 彻底放弃域名系统,完全使用基于 IP 系统的通讯。
   原本请求 https://www.duitang.com 的 request, 调整为请求 https://221.228.82.181 。
  OK,做到这一步,我们就可以跟运营商劫持说拜拜了。
  不,还没结束。
   完全搞定运营商之后,这 IP 方案给我们自己带来一个困扰: Nginx 服务器无法通过 Host 来识别不同域名下面的请求了!!! 在由于使用一个独立 IP,会导致所有域名请求混在一起,无法分别。 大公司可以 dedicated IP,小公司就玩不起了。
   为了解决同一个 IP 下面多个域名的问题,我们引入了一个URL参数: __domain 。 当请求 IP 域名时候,必须带着这个参数,服务器会将请求域名解析出来,再分发到对应的域名。
  实现这个逻辑的 Nginx 核心代码:
  [code]set $query_domain $arg___domain;
if ($query_domain !~ '(www|a|b)\.example\.com') {
    rewrite ^ http://www.example.com/404/ redirect;
}
set $my_host $query_domain;
location / {
    proxy_set_header Host $my_host;
    proxy_set_header X-REAL-IP $remote_addr;
    proxy_pass http://127.0.0.1;
}[/code]  最后一个注意事项是,记得调整 Nginx 配置的 remote_addr,否则都变成了 127.0.0.1, 也许会导致其他一些策略失效。
   完美收工,效果如下: https://221.228.82.181/?__domain=www.duitang.com 。
  恭喜你,已经掌握核心科技了,再也不怕运营商瞎折腾了,从此走上了业务蓬勃发展的金光大道……:sunny:
  下一篇文章,我会再谈谈如何做 HTTPS 的「内测」,避免将线上业务一次性切到 HTTPS 导致不少边边角角业务无法正常使用。
友荐云推荐




上一篇:EC2 Instances (F1) with Programmable Hardware (FPGA)
下一篇:Amazon Athena: Query S3 Using SQL
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

先锋网络 发表于 7 天前
太邪乎了吧?
回复 支持 反对

使用道具 举报

狼1234 发表于 5 天前
学习下...
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表