一、前言
     通常的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. NSDateFormatter相关整理

    //实例化一个NSDateFormatter对象NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; //设定时间格式,这里可 ...

  2. MySQL改写子查询成Join

    有时用别的方式而不是子查询可以获得更高的性能 : For example: SELECT * FROM t1 WHERE id IN (SELECT id FROM t2); 改写: SELECT D ...

  3. word:Can't find the word document templant:WordToRqm.doc

    问题:打开word文件时弹出提示 Cannot find the Word template:WordToRqm.dot 原因:安装了power designer. 解决:运行regedit.exe ...

  4. linux mysql 修改 UTF-8编码

    版本大于5.5 [mysqld]下添加的应该为:   character-set-server=utf8   collation-server=utf8_general_ci 版本小于5.5 [cli ...

  5. Windows核心编程&进程

    1. 进程的定义 说白了进程就是一个正在运行的执行程序,包含内核对象和独立的地址空间,内核对象负责统计和管理进程信息,地址空间包括所有可执行文件或DLL 模块的代码和数据.动态内存分配(线程堆和栈的分 ...

  6. junit3.8的使用

    今天开始junit使用系列,第一篇梳理junit3X系列,先贴下代码来体验下. 测试源代码如下: package test.junit38test; /** * @创建作者: LinkinPark * ...

  7. linkin大话数据结构--Queue

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...

  8. SCOPE_IDENTITY()

    @@IDENTYITY,SCOPE_IDENTITY的主要区别:在有触发器中而且触发器的内容里面含有插入标识符的操作的时候,@@IDENTITY则返回的是触发器里面新插入标识符的值而SCOPE_IDE ...

  9. windows 查看端口被哪个程序占用

    比如查看端口8080 1. 查看占用端口8080对应的PID,输入命令:netstat -aon|findstr "8080" (加入查到pid为111222) 2. 继续输入ta ...

  10. PHP面试题超强总结(PHP中文网)

    PHP面试基础题目 1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符, ...