HTTPS 浅析

  • 网络七层协议
  • TCP/IP 五层协议
  • HTTPS 概念
  • HTTPS 优化

网络七层协议

OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。

分层原则
  • 网络中各结点都有相同的层次
  • 不同结点相同层次具有相同的功能
  • 同一结点相邻层间通过接口通信
  • 每一层可以使用下层提供的服务,并向上层提供服务
  • 不同结点的同等层间通过协议来实现对等层间的通信
OSI模型把网络通信的工作分为7层,它们由高到低分别是:
OSI网络七层协议模型.png

发送方数据由最高层逐渐向下层传递,到接收方数据由最低层逐渐向高层传递。
PS:并不是每一通信都需要经过OSI的全部七层,有的甚至只需要双方对应的某一层即可。总的来说,双方的通信是在对等层次上进行的,不能在不对称层次上进行通信。

TCP/IP 五层协议

TCP/IP 五层协议.png

TCP/IP模型实际上是OSI模型的一个浓缩版本。

OSI模型的网络层同时支持面向连接和无连接的通信,但是传输层只支持面向连接的通信。
TCP/IP模型的网络层只提供无连接的服务,但是传输层上同时提供两种通信模式。

HTTPS

HTTPS和HTTP的区别主要如下:

  1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
image.png

如图所示:
HTTP是应用层协议、TCP是传输层协议、IP是网络层。
HTTPS则是在应用层和传输层中加了一层 SSL/TLS

http and https.png
通信加密过程:
image.png

客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。

  1. 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
  2. Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  3. 客户端开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
    • 如果找不到,客户端就会报错,说明服务器发来的证书是不可信任的。
    • 如果找到,那么客户端就会从操作系统中取出颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密。浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比,对比结果一致,则证明服务器发来的证书合法,没有被冒充。
  4. 客户端的浏览器建立对称密钥,然后利用网站发送来的证书的公钥将对称密钥、对称秘钥算法加密,并传送给网站。
  5. Web服务器利用自己的私钥解密出对称密钥。
  6. Web服务器利用对称密钥加密与客户端之间的通信。
HTTPS 优点:

尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案。

  1. 所有信息都是加密传播,黑客无法窃听。
  2. 具有校验机制,一旦被篡改,通信双方会立刻发现。
  3. 配备身份证书,防止身份被冒充。
HTTPS 缺点:
  1. SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐
  2. HTTPS 降低用户访问速度(多次握手)
  3. 网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)
  4. HTTPS 涉及到的安全算法会消耗 CPU 资源,需要增加大量机器(https访问过程需要加解密)

HTTPS优化:

主要分为客户端优化和服务端优化两个方向:

客户端优化是针对发起 ssl client hello 的一端进行的优化。主要有三个大的方向:

  • 减少请求延时
  • 会话复用
  • 优化加密效率
减少请求延时

HSTS重定向技术
保证浏览器始终连接到网站的 HTTPS 加密版本。
使用前

1. 用户在浏览器里输入 http://www.domain.com/1213.gif点击回车以后,浏览器与服务器发生三次握手;

2. 服务器收到用户的请求,响应 301 状态码,让用户跳转到 HTTPS ,重新请求 https://www.domain.com/1213.gif;

3. 用户重新发起 HTTPS 请求,再次与服务器进行三次 TCP 握手;

4. TCP 握手成功后,浏览器开始与服务器进行 TLS 握手。

使用后

1. 用户在浏览器里输入 HTTP 协议进行访问时,浏览器会自动将 HTTP 转换为 HTTPS 进行访问,确保用户访问安全;

2. 省去301跳转的出现,缩短访问时间;

3. 能阻止基于 SSL Strip 的中间人攻击,万一证书有错误,则显示错误,用户不能回避警告,从而能够更加有效安全的保障用户的访问。

TLS握手优化
采用 False Start (抢先开始)技术,浏览器在与服务器完成 TLS 握手前,就开始发送请求数据,服务器在收到这些数据后,完成 TLS 握手的同时,开始发送响应数据。

CDN节点
RTT 的特点是节点越近延时越小,CDN 天然离用户最近,选择使用 CDN 作为 HTTPS 接入的入口,将能够极大减少接入延时。CDN 节点通过和业务服务器维持长连接、会话复用和链路质量优化等可控方法,极大减少 HTTPS 带来的延时。

会话复用

针对减少请求次数,主要的一个点是 SSL Session 的复用,客户端请求中的 Session ID可以唯一的区分一个ssl 会话的ID。这个ID在客户端请求的时候被填写。

如果是第一次与服务端发生会话,那么Session ID可以是空。 如果之前与ssl 服务器建立过会话,而且客户端开启了Session Ticket;并且Server cache了这个Session Ticket�的时候,服务端与客户端的握手就会简化,省略掉pre master交换的过程,直接复用之前的ssl 会话。

优化加密效率

主要耗时的过程在于:

  • 密钥协商阶段的非对称加密
  • 协商过后的针对通信的对称加密

服务端的优化有几个方向

  • 规避完全握手
  • 优化加密效率
  • 优化证书验证流程
规避完整握手

服务端规避完全握手也是通过回复会话的方式,但是对于如何成功命中Session ID恢复会话,有两个点:

  • 开启 session ticket
  • 配置session cache

session cache 这里就会涉及到很多问题。当前互联网场景下,大部分web服务采取了分布式的服务方式。如何共享session cache 使得经过负载均衡的请求无论落到哪个节点都可以命中cache 就是我们的一个目标。

个人所知的两种做法:(欢迎指正!)

  1. 中央session服务器
    请求落在负载均衡后的服务器上,该服务器再去中央session服务器获取session cache。优点是可即时获取session、易于管理,缺点是中央session服务器压力较大。
  2. 互通session
    各个节点服务器上都存一份全部的session,定时互通。优点是压力小,缺点是获取session有延时。
优化加密效率

本地接入消耗过多的 CPU 资源,浪费了网卡和硬盘等资源,考虑将最消耗 CPU 资源的RSA解密计算任务转移到其它服务器,如此则可以充分发挥服务器的接入能力,充分利用带宽与网卡资源。远程解密服务器可以选择 CPU 负载较低的机器充当,实现机器资源复用,也可以是专门优化的高计算性能的服务器。当前也是 CDN 用于大规模HTTPS接入的解决方案之一。

密钥协商阶段基本占据了90%的时间。在没有办法规避完全握手的时候,我们要尝试进行算法的优化。
目前来看可以采用的非对称加密方式大约有以下的选择:

  • RSA:算法实现简单,诞生于1977年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数(目前常用的是2048位)来保证安全强度,很消耗CPU运算资源。RSA是目前唯一一个既能用于密钥交换又能用于证书签名的算法。
  • DH:diffie-hellman密钥交换算法,诞生时间比较早(1977年),但是1999年才公开。缺点是比较消耗CPU性能。
  • ECDHE:使用椭圆曲线(ECC)的DH算法,优点是能用较小的素数(256位)实现RSA相同的安全等级。缺点是算法实现复杂,用于密钥交换的历史不长,没有经过长时间的安全攻击测试。
  • ECDH:不支持PFS,安全性低,同时无法实现false start。

针对业内的选择,大部分是使用RSA加密的方式+椭圆曲线优化的DH加密,目前来看有两个优化点:

  1. 针对椭圆曲线,选择更高效优化过的曲线模型。调优openssl 编译参数。
  2. 采用硬件加速的方式来优化,为接入服务器安装专用的SSL硬件加速卡,作用类似 GPU,释放 CPU,能够具有更高的 HTTPS 接入能力且不影响业务程序。
优化证书验证 OCSP

证书验证是客户端验证服务端的过程。

通常服务端会发送网站的证书,这个证书是由可信机构签发的。客户端在认证这个证书的时候,会先向可信机构查询站点证书的上一级中间证书的权威。然后再查询中间证书对应的根证书的权威。这个过程就是证书链查询。

OCSP 是服务端把自己的站点证书和中间证书以及根证书打包一起下发到客户端,省去客户端查询的过程。

你可能感兴趣的:(HTTPS 浅析)