一、前言
     通常的http访问会遭到中间人攻击、网络嗅探等普通用户感知不到的恶意行为,这些行为会篡改用户浏览页面引导用户访问非法网站、抓取用户的上网行为以及个人信息、严重的会造成用户的个人资产损失。https由于采用了从用户端浏览器和网站服务端的证书加密认证机制,在信息的整个传输过程中都是以加密形式存在的,因而采用https可以解决http访问中所遭遇的中间人攻击、网络嗅探等问题。所以,目前大多数公司都将网站由http向https迁移,保护用户信息的安全。在进行https改造的过程中会遇到各种各样的问题,本人在infoq的网站上阅读了三篇有关BAT网站https的经历文章,下面就跟大家一起分享下,(如本人分享内容有错误、不足之处还请大家指出。)
 
     二、博文整理
     百度:
  • 挑战:https相比于http,加解密需要的计算资源大量增加,导致同样的服务器从http切换到https后,QPS只能达到之前的10-20%。
          解决方案:通过分析对比https与http连接耗时,发现https新建加密(非对称)连接握手时最消耗性能。采用https连接复用(session cache等方法)、专门设计的硬件加密卡(FPGA)来专门处理加解密操作,降低CPU的负载压力提升系统QPS。
 
  • 挑战:因为https中不能包含http流量,因此需要全站https
          解决方案:全站使用https可以保证网站的安全、用户数据的安全,还可以为将来向http2迁移做准备(http2基于https)。但是由于网站中很多地方引用外部的http资源,因此需要与各个部门沟通配合迁移(沟通、整合成本高)
 

     腾讯:
  • 当前网络中http与https的份额是6:4,原因主要是:https速度慢(未经任何优化)、证书申请成本高(流程复杂、花钱购买高级别证书)。因此,https迁移的主要关注点就是:1、运用多种技术手段提升https的速度,优化用户体验;2、降低证书申请的成本
  • 挑战:https加密涉及到多种加密算法(非对称加密、对称加密、签名算法、一致性校验算法等)
          解决方案:1、重点关注业界加密算法的动态,采用开源+自研组合的方式提升加密算法的性能;2、修改加密算法的调用方式,将加解密相关代码与其余代码解耦,然后利用专门设计的硬件加密卡(或者其他地方富余的GPU、CPU计算资源)来进行相关的加解密计算。
 
  • 挑战:通常情况下采用完全握手的https连接方式的性能甚至不如http协议性能的10%
          解决方案:采用session方案,通过减少https握手次数实现https性能的提升。具体做法:
  1. 分布式session cache:nginx集群将产生的session cache统一存储到后端同一个redis集群中,利用redis集群实现了nginx集群的session cache共享。
  2. 由于session cache会消耗大量内存,因此出现了将session 信息加密存储到用户设备的内存中,用户将加密的session信息发送到nginx集群,nginx利用保存的key来解密session,最终实现了session机制。可以将用户内存中加密的session信息写入磁盘,这样可以解决浏览器意外重启、app异常、网络切换等等问题导致的session丢失的问题;同时服务端将session 的key统一保存到redis集群中,或者一个集群采用同一个key来解决负载均衡带来的加解密失败的问题。
 
  • 挑战:当用户网站位于多个云、CDN上面时,如果每个地方都部署一个私钥,可能会因为一个位置的私钥泄露引发整个网站的安全问题
         解决方案:将私钥保存到某个位置,然后提供接口供相关服务调用,这样只需要保证私钥所在服务器的安全即可。
 

     阿里:
  • 挑战:淘宝、天猫、聚划算入口下有非常多的子项目,这些项目都在采用不同的网络架构为用户提供服务
         解决方案:如果各个项目自己进行https改造,这样会给后期升级改造增加很多工作量,同时进度也不好把控。在用户端和网站服务器间添加统一的SSL/TLS加密层,由集团运维统一负责。
 
  • 挑战:用户输入http自动跳转到https
         解决方案:1、将http://改成//(标准协议的一种),服务端判断有无https,如果有的话就采用https否则就用http;但是,//协议虽然是标准协议,但是由于用户少,所以主流语言框架支持较差,在linux等环境中甚至还有可能出现歧义。2、利用Tengine(nginx的一种变体)的sub_filter模块,将http替换成https,这种方式需要添加对应的正则表达式规则,但是随着正则表达数的增多,nginx的性能会下降。
 
  • https性能优化
         解决方案:1. 减少https常规的完全握手次数:session cache、session ticket、TCP keepalive、SPDY3.1 & HTTP2协议(增加https多路复用,有效减少新建连接数); 2. 合并域名(TLS新建连接成本高); 3. Flase Start 采用1-RTT建连,降低握手成本; 4. CDN动态加速、前段预加速; 5. 采用ECDSA    
 
 
三、个人总结
        在阅读了BAT三家大厂的https迁移、优化的经历,发现在技术方面还是存在很多通用的解决方案的,以后在进行http到https迁移的时候可以借鉴相关经验。
  1. 采用session ticket来实现http状态保持。
  2. nginx集群+redis 实现分布式共享内存的方案。
  3. 解耦加解密模块,利用定制的硬件加密卡或者别处空闲的CPU、GPU资源来执行加解密操作,然后常规代码异步调用加解密模块,降低http服务器的cpu压力,提示QPS。
  4. 使用SPDY、HTTP2 等支持多路复用的协议来降低TLS建连的次数。
  5. 利用Flase Start的1-RTT建连,降低TLS握手次数。
  6. CDN动态加速、预建连接,提升用户体验
  7. 优化加解密算法
 

案例分析——BAT业务https化经历的更多相关文章

  1. Android业务组件化之现状分析与探讨

    前言: 从个人经历来说的话,从事APP开发这么多年来,所接触的APP的体积变得越来越大,业务的也变得越来越复杂,总来来说只有一句话:这是一个APP臃肿的时代!所以为了告别APP臃肿的时代,让我们进入一 ...

  2. [案例分析] 政务云市场面临的复杂格局——重庆政务云模式的启示:多厂商竞争化、PaaS 化

    新闻背景: 2019 年 9 月底,重庆市大数据应用发展管理局发布政务云平台采购公告,预算金额为 5000 万元,以上 4 家入选. 最终项目被项目被阿里云.腾讯云.华为云.紫光云 4 家瓜分. 50 ...

  3. ENode框架Conference案例分析系列之 - 业务简介

    前言 ENode是一个应用开发框架.通过ENode,我们可以方便的开发基于DDD+CQRS+EventSourcing+EDA架构的应用程序.之前我已经写了很多关于ENode的架构以及设计原理的文章, ...

  4. 用深度学习LSTM炒股:对冲基金案例分析

    英伟达昨天一边发布“全球最大的GPU”,一边经历股价跳水20多美元,到今天发稿时间也没恢复过来.无数同学在后台问文摘菌,要不要抄一波底嘞? 今天用深度学习的序列模型预测股价已经取得了不错的效果,尤其是 ...

  5. 5、JVM--调优案例分析

    5.1.案例分析 5.1.1.高性能硬件上的程序部署策略 假如一个15w/天左右的在线文档类型网站再准备更换硬件系统 新的硬件为4个CPU.16GB物理内存,操作系统为64为Cento是 Resin作 ...

  6. java 并发基础,及案例分析

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了,然而并发问题是令我们大多数程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们深入研 ...

  7. 软工案例分析作业-CSDN

    项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业要求 我在这个课程的目标是 提升软件开发能力与团队意识 这个作业在哪个具体方面帮助我实 ...

  8. “深度评测官”——记2020BUAA软工软件案例分析作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 完成一次完整的软件开发经历并以博客的方式记录开发 ...

  9. ENode框架Conference案例分析系列之 - 文章索引

    ENode框架Conference案例分析系列之 - 业务简介 ENode框架Conference案例分析系列之 - 上下文划分和领域建模 ENode框架Conference案例分析系列之 - 架构设 ...

随机推荐

  1. [转]【Java】内部类(Inner Class)如何创建(new)

    简单来说,内部类(inner class)指那些类定义代码被置于其它类定义中的类:而对于一般的.类定义代码不嵌套在其它类定义中的类,称为顶层(top-level)类.对于一个内部类,包含其定义代码的类 ...

  2. Thrift之TProtocol系列TCompactProtocol解析

    TCompactProtocol协议作为TBinaryProtocol协议的升级强化版,都作为二进制编码传输方式,采用了一种乐器MIDI文件的编码方法(wiki,百度下),简单介绍下两种思想: 1: ...

  3. MySQL Index Merge Optimization

    Index Merge用在通过一些range scans得到检索数据行和合并成一个整体.合并可以通过 unions,intersections,或者unions-intersection运用在底层的扫 ...

  4. svn checkout The XML response contains invalid XML

    svn checkout 报错:The XML response contains invalid XML 待解决? ---目前没有找到好的解决方法,svn数据库中存的log入手应该可以,有时间再去看 ...

  5. shell 学习四十五天---xargs

    当 find 产生一个文件列表时,该列表提供给另一个命令有时是很有用的.案例: $touch abc.c erd.c oiy.c $ll ./erd.c ./abc.c ./oiy.c $find - ...

  6. Go_Hello word

    与Go相关直接命令有哪些? go get    获取远程包 go run    直接运行程序 go bulid  测试编译 go fmt    格式化代码 go install       编译包文件 ...

  7. python_如何在循环引用中管理内存?

    案例: python中通过引用计数来回收垃圾对象,在某些环形数据结构(树,图--),存在对象间的循环引用,比如树的父节点引用子节点,子节点同时引用父节点,此时通过del掉引用父子节点,两个对象不能被立 ...

  8. 如何使用 volatile, synchronized, final 进行线程间通信

    原文地址:https://segmentfault.com/a/1190000004487149.感谢作者的无私分享. 你是否真正理解并会用volatile, synchronized, final进 ...

  9. Linux指令--more,less

    文章出处:http://www.cnblogs.com/peida/archive/2012/11/05/2754477.html,感谢原作者无私的分享. more命令,功能类似 cat ,cat命令 ...

  10. 无废话XML--XML细节

    今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍.作为基本的2种的数据交互载体(还有一个是json),基本的X ...