iOS底层探究

HTTPS详解:SSL/TLS协议

2018-11-26  本文已影响0人  小生很忙

摘要: 最近在看关于web安全相关的书籍,说到web安全HTTP和HTTPS之间的联系和区别是一个无法回避的问题。很长时间以来,我也被这个问题所困扰,对于其中涉及的细节问题更是难以触及,但是现在是该去好好考虑这个问题了。在网上查阅了大量资料之后,我发现很多文章在解释这个问题的时候含糊不清,让人难以理解。所以我写下了这篇博客,希望能给大家提供帮助,如有不足之处,欢迎指正!

avatar

文章概览

区别与联系

HTTP和HTTPS

联系
  HTTP(超文本传输协议)是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。可以从HTTP头、HTTP请求方法、HTTP状态码和统一资源定位符URL四个方面深入理解HTTP协议。

avatar
  超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,易遭受窃听、篡改、劫持等攻击,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,一次HTTPS协议实现了数据传输过程中的保密性、完整性和身份认证性。

区别
  HTTP和HTTPS的主要区别如下包括:HTTPS协议需要到CA申请证书,而HTTP协议则不用;HTTP是超文本传输协议,信息是明文传输,而HTTPS则是加密传输;HTTP和HTTPS使用完全不同的连接方式,所占用的端口也不一样,前者占用80端口,后者占用443端口;HTTPS传输过程比较复杂,对服务端占用的资源比较多,由于握手过程的复杂性和加密传输的特性导致HTTPS传输的效率比较低;HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

SSL和TLS

联系
  SSL(Secure Sockets Layer 安全套接层)为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
  安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面,与具体的应用无关,所以,一般把TLS协议归为传输层安全协议。TLS 的最大优势就在于:TLS 是独立于应用协议。高层协议可以透明地分布在 TLS 协议上面。然而,TLS 标准并没有规定应用程序如何在 TLS 上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。
  SSL是Netscape开发的专门用户保护Web通讯的,而TLS1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别很小,可以理解为SSL 3.1,它是写入了RFC的。为了兼顾各种说法本文将SSL和TLS统称为SSL/TLS,但是请注意,本文所涉及的关于各种协议的解析是基于TLS1.2版本(这是目前使用最广泛的版本)。
区别
  SSL和TLS的主要区别如下:

SSL/TLS协议

密码套件(cipher suite)

  密码套件(Cipher suite)是传输层安全(TLS)/安全套接字层(SSL)网络协议中的一个概念。在TLS 1.2中,密码套件的名称是以协商安全设置时使用的身份验证、加密、消息认证码(MAC)和密钥交换算法组成。TLS 1.3中的密码套件格式已经修改。在目前的TLS 1.3草案文档中,密码套件仅用于协商加密和HMAC算法。在创建一个TLS连接后,一次也称TLS握手协议的握手发生。在这个握手,一条ClientHello和一条ServerHello消息被发出。首先,客户端按照偏好的顺序发送它支持的密码套件的列表。然后服务器回复它从客户端的列表中选择的密码套件。
  例如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,每个密码套件名称定义一个密钥交换算法、一个批量加密算法、一个消息认证码(MAC)算法,以及一个伪随机函数(PRF)

理解密码套件的作用以及组成部分对我们理解握手协议的过程十分重要,因为使用不同的密码套件在握手协议的实现细节上有很大的不同,特别是密钥交换的过程。本文将主要讲解ECDHE_RSA密钥交换算法下的握手过程(也可以理解为三种不同密码套件的握手过程,对于握手过程而言不同套件的差异主要体现在密钥交换的过程,批量加密算法和消息验证码算法的不同主要体现在加密传输的过程,伪随机算法的不同体现在产生分组加密初始向量的过程)。

记录协议

  TLS记录协议位于TLS握手协议的下层,在可靠的传输协议(如TCP/IP)上层。TLS记录协议的一条记录包含长度字段、描述字段和内容字段。TLS记录协议处理数据的加密,即记录协议得到要发送的消息之后,将数据分成易于处理的数据分组,进行数据压缩处理(可选),计算数据分组的消息认证码MAC,加密数据然后发送数据;接收到的消息首先被解密,然后校验MAC值,解压缩,重组,最后传递给协议的高层客户。记录协议有四种类型的客户:握手协议、警告协议、改变密码格式协议和应用数据协议。通常使用一个对称算法,算法的密钥由握手协议提供的值生成。TLS 记录协议提供的连接安全性具有两个基本特性:

握手协议

  TLS握手协议处理对等用户的认证,在这一层使用了公共密钥和证书,并协商算法和加密实际数据传输的密钥,该过程在TLS记录协议之上进行。TLS握手协议是TLS协议中最复杂的部分,它定义了10种消息,客户端和服务器利用这10种消息相互认证,协商哈希函数和加密算法并相互提供产生加密密钥的机密数据。TLS记录协议会在加密算法中用到这些加密密钥,从而提供数据保密性和一致性保护。
  我们先来分析基于ECDHE_RSA密钥交换算法的握手过程,在这之前先来解释一下ECDHE是什么。ECDHE_RSA = EC(椭圆曲线加密算法)+ DH(Diffie-Hellman密钥交换算法)+ E(临时的temporary)+ RSA(用于签名,防止中间人攻击),所以ECDHE的意思是结合椭圆曲线的生成临时会话密钥的密钥交换算法。对于这个算法的具体计算过程,这里不详细讨论。
  下图是EDCHE_RSA密钥交换算法的大致流程,接下来我会结合wireshark抓取的数据包来分析握手的过程:

avatar

  值得注意的是在这个过程中客户端和服务器端都各自产生一对公钥和私钥还有一个随机数,这些都是作为生成预主密钥的元素。预主密钥分别在客户端和服务器端生成,算法的特性能够保证二者生成的预主密钥相同。那么由预主密钥如何生成会话密钥呢,这就要用到前面提到的伪随机函数,通过预主密钥我们将生成客户端验证密钥、服务器端验证密钥、客户端加密密钥、服务器端加密密钥以及客户端分组加密的初始向量和服务器端的分组加密初始向量,具体生成过程可以参考这篇博客。对基于DH算法和RSA算法的握手过程可以参见下图,也可以参考这篇博客

avatar avatar

前向安全

  在这里有必要提一下关于前向安全的定义:前向安全或前向保密,有时也被称为完美前向安全(Perfect Forward Secrecy,缩写:PFS),是密码学中通讯协议的安全属性,指的是长期使用的主密钥泄漏不会导致过去的会话密钥泄漏。前向安全能够保护过去进行的通讯不受密码或密钥在未来暴露的威胁。如果系统具有前向安全性,就可以保证在主密钥泄露时历史通讯的安全,即使系统遭到主动攻击也是如此。在传输层安全协议(TLS)中,提供了基于迪菲-赫尔曼密钥交换(DHE)的前向安全通讯,分别为(DHE-RSA)和DHE-DSA),还有基于椭圆曲线迪菲-赫尔曼密钥交换(ECDHE)的前向安全通讯,包括(ECDHE-RSA与ECDHE-ECDSA)。理论上,从SSLv3开始,就已经可以使用支持前向安全的密码算法进行通讯。之前我们提到ECDHE算法在sever key exchage阶段会生成一个临时的公私钥对,公钥发送给用户,私钥用于对数据进行RSA签名来验证服务器的身份,如果服务器的私钥泄露,这些会话不会受到影响,无法解密。对于有些算法而言,它在握手过程中不会有这个生成公私钥对的过程,它将使用服务器的私钥进行签名。如果服务器的私钥泄露,这些会话都将被暴露,这就是所谓的前向安全。

上一篇 下一篇

猜你喜欢

热点阅读