SSL/TLS是使用最广泛的加密通信方法。

SSL/TLS中广泛运用了对称密码、消息认证码、公钥密码、数字签名、伪随机数生成器等密码技术。

SSL(Secure Socket Layer)与TLS(Transport Layer Security)是不同的,TLS相当于是SSL的后续版本。

SSL/TLS可以通过切换密码套件来使用强度更高的密码算法。

SSL/TLS简介

访问网站时,客户端和服务器都是基于HTTP(TyperText Transfer Protocol)来进行通信。其中Web浏览器称为HTTP客户端,Web服务器称为HTTP服务器

当在网站上点击链接时,Web浏览器通过网络向Web服务器发送“浏览网页”的请求,Web服务器将请求的网页发送回浏览器,以便对请求做出响应

HTTP是在HTTP客户端与服务器之间进行请求和相应的规范。

SSL或者TLS可以作为对通信进行加密的协议,然后在此之上承载HTTP。两种协议进行叠加,就可以对HTTP通信进行加密。

使用的密码技术

使用SSL/TLS进行加密通信的目的有3个,分别是:

  1. 确保通信内容不能被窃听。
  2. 确保通信内容不能被中途篡改。
  3. 确保通信对象无误。

即1、2、3分别是机密性、数据完整性以及认证的问题。

要确保机密性,可以使用对称密码。由于对称密码不能被攻击者预测,因此可以使用伪随机数生成器来生成密钥。若要将对称密码发送给通信对象,可以使用公钥密码Diffie-Hellman密钥交换

要识别篡改、对数据进行完整性校验,可以使用消息认证码。消息认证码是带密码的单向散列函数实现的。

要对通信对象进行认证,可以使用对公钥进行数字签名生成的证书。

基于SSL/TLS的协议架构

SSL/TLS不仅可以加密HTTP通信,也可以支持其他协议,比如SMTP、POP3等。

SSL与TLS的区别

TLS通信

TLS协议是由TLS记录协议和TLS握手协议叠加而成。

位于底层的TLS记录协议负责加密,位于上层的TLS握手协议负责除加密之外的其他各种操作。

TLS记录协议

位于TLS握手协议的下层,负责消息的压缩、加密以及数据的认证

至于消息压缩的算法、加密算法及其密钥、数据认证的算法及其密钥都取决与TLS握手协议协商的过程。完成握手之后会将这些参数传递给TLS记录协议,进行数据处理。

步骤如下

  1. 消息被分割为较多的片段,然后对每个片段进行压缩。
  2. 给经过压缩的片段附加消息认证码,确保数据完整性,识别篡改,并增加片段编号,防止重放攻击。
  3. 对称密码加密步骤2的结果。
  4. 将经过加密的数据再加上数据类型、版本号、压缩后的长度组成包头,即为最终的报文数据。

如上图所示,类型指的是TLS握手协议所承载的4个子协议(握手协议(0x16)、密码规格变更协议(0x14)、警告协议、应用数据协议(0x17))之一。

TLS握手协议

TLS握手协议分为4个子协议:握手协议、密码规格变更协议、警告协议以及应用数据协议。

握手协议

握手协议负责在客户端和服务器之间协商决定密码算法、生成共享密钥以及认证操作(交换证书)

生成共享密钥是为了加密通信,交换证书为了通信双方或单方进行认证。

握手协议中的“握手”指的是服务器和客户端在加密通信之前交换一些必要信息。

握手协议中的信息是在没有加密的情况下进行的,存在数据泄露的风险,因此必须使用公钥密码或者Diffie-Hellman密钥交换

握手协议过程如下图:

说明:

  1. 步骤(1)和步骤(2)来确定,使用的密码套件。从下图中可以得知使用的是对称加密方式,具体是AES_128_GCM_SHA256。密钥交换算法是ECDHE,即基于椭圆曲线的Diffie-Hellman。RSA指的则是数字签名算法。
  2. 客户端和服务器都会发布的随机数是用来和预备主密钥一起生成主密钥的。
  3. 步骤(3)中的证书清单是一组X.509证书序列,包括服务器和认证机构的证书,用以确保服务器可信。匿名通信,不发送Certificate消息。抓包结果如下图:
  4. 步骤(4)中,当使用RSA密钥交换时,步骤(3)中的证书就已足够;但当使用Diffie-Hellman密钥交换时,就需要该步骤交换信息,抓包结果如下图:
  5. 只有要进行客户端认证时才会执行步骤(5)、步骤(7)以及步骤(9)。
  6. 步骤(9)的实现方法是客户端使用私钥对消息进行签名,然后服务端使用步骤(7)发送的证书验证签名,确认客户端对象可信。
  7. 步骤(8)中,如果使用RSA,发送的是经过加密的预备主密钥,该预备主密钥是由步骤(3)得到的服务器公钥来加密。如果使用Diffie-Hellman,则发送的是Diffie-Hellman公开值。
  8. 步骤(10)传递的是密码变更协议的消息,表示客户端和服务器的数据交换完毕,之后客户端和服务器同时切换密码,采用协商的加密通信方式。
  9. 步骤(11)实际上发送的是握手协议完成之后,客户端发送的第一笔数据Encrypted Handshake Message。
  10. 步骤(12)是服务器告知客户端切换密码,并且自此之后,服务器也使用加密方式来通信了。

在上面抓包的示例中,在协商伊始就交换了加密以及签名算法,随后使用RSA公钥证书确保服务器无误;使用Diffie-Hellman密钥交换协议来生成预备主密钥,再进一步生成对称密码的密钥。

在服务器和客户端之间通过握手协议协商一致之后,就会互相发送信号来切换密码。负责发出信号的就是密码变更协议,即Cipher Change Spec。

密码变更协议

在握手完成之后,客户端和服务器通过密码变更协议分别通知对方切换为加密通信。

但并不意味着只有在第一次“不加密”之后可用,在加密通信之后可以通过重新握手,再次改变密码套件。

警告协议

用于当发生错误时通知通信对象。

错误一般包括握手过程出现异常、消息认证码错误、压缩数据无法解压缩等。

应用数据协议

用于和通信对象之间传送应用数据。

主密钥

主密钥是TLS客户端和服务器之间协商出来的一个48字节的数值。用于确保加密通信中数据的机密性和认证。

主密钥是由客户端和服务器分别根据预备主密钥、客户端随机数以及服务器随机数计算出来的。

当使用RSA公钥加密时,客户端会在发送Client Key Exchange消息时,将经过加密的预备主密钥一起发送给服务器。

当使用Diffie-Hellman密钥交换时,客户端会在发送Client Key Exchange消息时,将Diffie-Hellman的公开值发送给服务器。根据这个值,客户端和服务器会分别生成预备主密钥

客户端随机数和服务器随机数的作用是防止攻击者事先计算出密钥的盐

预备主密钥、客户端随机数、服务器随机数,这三个数用来生成主密钥:

生成主密钥需要使用基于密码套件中定义的单向散列函数来实现的伪随机函数PRF(Pseudo Random Function)。

TLS密码技术

密码技术作用
公钥密码加密预备主密码
单向散列函数构成伪随机数生成器
数字签名验证客户端和服务器的证书
伪随机数生成器生成预备主密码、根据主密钥生成密钥、生成初始化向量

攻击

  1. 对各种密码技术进行攻击。
  2. 对伪随机生成器进行攻击。
  3. 利用证书的时间差进行攻击。

注意事项

在SSL/TLS中,可以通过证书对服务器进行认证。但是这个仅仅确保访问了正确的服务器,但是不能确保服务器中运行的功能是否安全。

加密通信只保证通信过程是被保护的。但在通信之前和通信之后都不受保护,比如在浏览器输入的时候、以及服务器通过加密方式接收到数据之后。