一、前言
     通常的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. 月薪20k以上的高级程序员需要学习哪些技术呢?

    课程内容: 源码分析.分布式架构.微服务架构.性能优化.团队协作效率.双十一项目实战 适用对象: 1-5年或更长软件开发经验,没有工作经验但基础非常扎实,对java工作机制,常用设计思想,常用java ...

  2. java 三大框架

    SSH即:Spring.Struts.HibernateSpring:功能强大的组件粘合济,能够将你的所有的java功能模块用配置文件的方式组合起来(还让你感觉不到spring的存在)成为一个完成的应 ...

  3. ios 积累

    1.加号 是可以通过类名直接调用这个方法,而减号则要实例化逸个对象,然后通过实例化的对象来调用该方法!! 2.(返回类型) 方法名 :(参数类型)变量名 空格 参数二名 :(参数类型) 变量名 空格 ...

  4. ClassLoader.getResourceAsStream() 与 Class.getResourceAsStream()的区别

        Class.getResourceAsStream() 会指定要加载的资源路径与当前类所在包的路径一致. 例如你写了一个MyTest类在包com.test.mycode 下,那么MyTest. ...

  5. 输入和输出--javase中的路径

    就目前为止, javase中经常用到路径来读取一个资源文件的所有情况都已经整理在博客里面了,这里做一个统一的整理: 1,IO流来读取一个文件,比如说new FileInputStream(" ...

  6. 【转】ArcGIS中File Geodatabase与Personal Geodatabase的区别

    原文地址:ArcGIS中File Geodatabase与Personal Geodatabase的区别作者:最爱忆宝贝 一.平台支援: 1.Personal Geodatabase:仅可在Windo ...

  7. 【转】globk中的控制文件

    globk_comb.cmd * This group must be first eq_file ../tables/eq_renames make_svs ../tables/sat1.apr c ...

  8. [DeeplearningAI笔记]改善深层神经网络1.4_1.8深度学习实用层面_正则化Regularization与改善过拟合

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.4 正则化(regularization) 如果你的神经网络出现了过拟合(训练集与验证集得到的结果方差较大),最先想到的方法就是正则化(re ...

  9. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  10. SpringMVC源码情操陶冶-DispatcherServlet简析(二)

    承接前文SpringMVC源码情操陶冶-DispatcherServlet类简析(一),主要讲述初始化的操作,本文将简单介绍springmvc如何处理请求 DispatcherServlet#doDi ...