SSL/TLS 流程

SSL/TLS

Apple 在 WWDC 2015 上提出了 App Transport Security (ATS) 的概念。其中就要求服务器使用最新的TLS1.2安全协议。所以有必要了解下什么是TLS。

简介

SSL/TLS

SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。因为原先互联网使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥、篡改,身份会被冒充。SSL 就是为了解决这些问题。

因为SSL 应用广泛,IETF 就把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。

这两者可以视作同一个东西的不同阶段。

HTTPS

我们通常所说的 HTTPS 协议,其实就是就是“HTTP 协议”和“SSL/TLS 协议”的组合。可以理解为“HTTP over SSL”或“HTTP over TLS”。      

加密算法简介

SSL/TLS 协议中包含很多加密算法,我们先了解一下对称加密、非对称加密及HASH算法。

对称加密

就是加密和解密使用同一个密钥的加密算法。因为加密方和解密方使用的密钥相同,所以称为称为对称加密,也称为单钥加密方法。

  • 优点是:加密和解密运算速度快,所以对称加密算法通常在消息发送方需要加密大量数据时使用;
  • 缺点是:安全性差,如果一方的密钥遭泄露,那么整个通信就会被破解。另外加密之前双方需要同步密钥;

常用对称加密算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等;

非对称加密

而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

公钥和私钥是一对:公钥用来加密,私钥解密,而且公钥是公开的,私钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。

  • 有点是:安全性更好,私钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
  • 缺点是:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

常用的非对称加密算法有:RSA、Elgamal、Rabin、D-H、ECC等;

HASH

也称为消息摘要算法。将任意长度的二进制值映射为较短的固定长度的二进制值,该二进制值称为哈希值。

常用于检验数据的完整性,检验数据没有被篡改过。常见的又 MD5(MD系列),SHA-1(SHA系列)

流程

基本过程

根据比较对称加密和非对称加密,可以得出SSL/TLS协议的基本思路:

  1. 使用非对称加密算法来获得对称加密算法的秘钥(安全)
  2. 使用对称加密算法来加密传输内容(速度快)

但如何保证第一步非对称加密算法公钥不被篡改?

解决方法是将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。

因此,SSL/TLS协议的基本过程是这样的:

  1. 客户端向服务器端索要并验证非对称加密算法的公钥(也就是验证证书)。
  2. 双方协商生成对称加密算法的”对话密钥”。
  3. 双方采用对称加密算法和它的”对话密钥”进行加密通信。

当然验证过程也可以是双向的,也就是两者之间将会交换证书。基本的过程和单向认证完全一样,只是在协商阶段多了几个步骤。

具体流程

SSL/TLS 流程

如上图所示,流程如下:

  1. ClientHello:客户端发送所支持的 SSL/TLS 最高协议版本号、所支持的加密算法集合、压缩方法集合等信息给服务器端,以及一个随机数
  2. ServerHello:服务器端收到客户端信息后,选定双方都能够支持的 SSL/TLS 协议版本和加密方法及压缩方法,以及一个随机数,返回给客户端。
  3. (Optional)SendCertificate:服务器端发送服务端证书给客户端。
  4. (Optional)RequestCertificate:如果选择双向验证,服务器端向客户端请求客户端证书。
  5. ServerHelloDone:服务器端通知客户端初始协商结束。
  6. (Optional)ResponseCertificate:如果选择双向验证,客户端向服务器端发送客户端证书。
  7. ClientKeyExchange:客户端使用服务器端的公钥,对客户端公钥和密钥种子(一个随机数(Premaster secret))进行加密,再发送给服务器端。
  8. (Optional)CertificateVerify:如果选择双向验证,客户端用本地私钥生成数字签名,并发送给服务器端,让其通过收到的客户端公钥进行身份验证。
  9. CreateSecretKey:通讯双方基于密钥种子等信息生成通讯密钥。
  10. ChangeCipherSpec:客户端通知服务器端已将通讯方式切换到加密模式。
  11. Finished:客户端做好加密通讯的准备。
  12. ChangeCipherSpec:服务器端通知客户端已将通讯方式切换到加密模式。
  13. Finished:服务器做好加密通讯的准备。
  14. Encrypted/DecryptedData:双方使用客户端密钥,通过对称加密算法对通讯内容进行加密。
  15. CloseConnection:通讯结束后,任何一方发出断开 SSL 连接的消息。

使用DH算法

整个过程中已共使用了三个随机数来生成最终的“会话秘钥”,前两个随机数是明文的,所以整个通话的安全取决于最后一个随机数 Premaster secret。参考cloudflare 文中的两幅图:

使用 RSA:
SSL Handshake With RSA

使用 DH:
SSL Handshake With DH

采用 DH 算法后,Premaster secret 不需要传递,双方只要交换各自的参数,就可以得出这个随机数,这样就更安全了。

Cotin Yang wechat
欢迎订阅我的微信公众号 CotinDev
小小地鼓励一下吧~😘