一文搞懂SSL/TLS

时间:2022-12-10 08:54:32

1. 概述

安全套接字层(SSL,Secure Sockets Layer)是基于公钥密码*和X.509数字证书技术,为网络通信提供数据传输机密性及完整性的一种安全协议。

1994年,网景(Netscape)公司提出了SSL1.0,历经多次修改,1996年正式发布SSL3.0。1997年互联网工程任务组(IETF,Internet Engineering Task Force)发布基于SSL协议的互联网草案:传输层安全协议(TLS,Transport Layer Security)。1999年,IETF发布了正式的行业标准RFC2246 ,TLS/SSL直正成为通信安全标准。

SSL/TLS是位于传输层与应用层之间的加密协议,对于应用层来说是透明的,应用层数据通过传递给SSL层进行加密,并增加SSL头,再传递给传输层。
一文搞懂SSL/TLS
SSL/TLS均可提供身份认证、机密性和完整性服务,虽然SSL系列的所有版本都已经弃用,TLS作为SSL的后续版本,大家依然习惯使用SSL的叫法。

2. 协议组成

SSL协议由三部分组成:

  • 握手协议:协商加密算法、MAC算法以及会话密钥
  • 记录协议:对交换的数据进行加密和签名
  • 警报协议:解决出现的问题

2.1 握手协议(Handshake protocol)

握手协议是客户端和服务端建立SSL连接首先执行的协议,在传输数据之前完成,服务器和客户端使用这个协议相互鉴别对方的身份、协商加密算法、MAC算法以及加密数据使用的会话密钥。

(1)建立安全能力

  • Client Hello:客户端第一次连接到服务端时,将Client Hello作为第一条信息发给服务端,包含了客户端支持的加密组件(cipher_suite):加密算法、压缩算法、摘要算法,以及本次连接客户端生成的随机数。若客户端期望恢复上一次的会话还需发送会话ID。

  • Server HelloServer Hello是服务端对客户端Client Hello的回复,包含了服务端从Client Hello中选择的本次会话使用的加密算法、压缩算法、摘要算法,服务端确定的会话ID(session ID)、服务端的随机数。

(2)服务端认证与密钥交换

  • (Server) Certificate:若要求验证服务端,则服务端在Server Hello信息后发送其证书(certificate),通常为X.509v3版的Certificate。

  • Server Key Exchange:该消息补充以前在Server Hello消息声明中的密码组,为客户端提供继续通信所需要的算法变量(依赖于所选定的算法)。

  • Certificate Request:若服务端需要鉴别客户端的身份,它将向客户端发送Certificate Request。该消息包含了服务端可鉴别的证书类型和可信任的CA证书序列。

  • Server Hello Done:该信息表明Server Hello结束,等待客户端响应。客户端收到该信息后检查服务端提供的Certificate 是否有效,以及服务端的Hello参数是否可接受。

(3)客户端认证与密钥交换

  • (Client) Certificate:当服务端请求Certificate时,客户端收到服务端的Server Hello Done后发送该信息。若客户端没有合适的Certificate,则发送”没有证书”的警告信息。

  • Client Key Exchange:该消息内容取决于密钥交换算法类型

    • 若选择RSA算法,则该消息包含经RSA公钥加密的预加密主密钥(pre-master secret),其中RSA公钥为服务器证书中的公钥或Server Key Exchange服务端临时生成的RSA公钥。
    • 若选择DH算法,则该消息包含客户端使用服务端传来的DH算法参数生成的公共值,该公共值将被生成预加密主密钥。
  • Certificate Verify:该消息用于提供客户端Certificate验证,仅在具有签名能力的客户端传送 Certificate后传送。

(4)完成握手

  • Change Cipher Spec:用于发方告知收方,发方已完成加密规范改变,准备使用协商的加密套件件(Cipher Suite)和会话密钥(Session Key)加密数据并传输了,体现在数据包中就是一个字节的数据。

  • Finished:发方使用协商好的加密套件(Cipher Suite)和会话密钥(Session Secret)加密一段Finish数据传送给收方,收方在收到Finishe信息后须检查其内容是否正确,以是否成功建立加解密通道。

一文搞懂SSL/TLS
客户端和服务端对Finished信息进行验证,确定加密通道已经建立成功,双方就可使用产生的会话密钥(Session Secret)加密传输数据了。

2.2 记录协议(Record Protocol)

客户端和服务端完成鉴别并确定安全信息交换使用的算法后,进入SSL记录协议,主要提供两个服务:

  • 数据保密性:使用握手协议定义的秘密密钥对传送的数据加密。
  • 消息完整性:使用握手协议定义的带有MAC的密钥计算消息认证码。

记录协议接收到应用程序传送的消息,将数据分片(切成容易管理的小区块),然后选择是否对这些区块作压缩,再加上此区块的消息认证码,将数据区块与MAC一起做加密处理,加上SSL记录头后通过TCP传送出去。接收数据方对数据进行解密、验证、解压缩、重组,将消息的内容还原,传送给上层应用程序。
一文搞懂SSL/TLS

2.3 警报协议(Alert Protocol)

当客户机和服务器发现错误时,会向对方发送一个警报消息。如果是致命错误,算法立即终止会话并关闭SSL连接,同时删除相关会话记录、秘密和密钥。

3. 密码套件与密钥生成

(1)密码套件(cipher_suite)

密码套件是一组选定的加密基元和其他参数,包括密钥交换算法、身份验证算法、数据加密算法和散列算法。

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA156表示:

  • 密钥交换:ECDHE
  • 身份验证:RSA
  • 数据加密算法:AES_128_GCM
  • MAC:SHA156

(2)密钥生成

  • 预主密钥(PreMaster secret):PreMaster Secret由客户在Client Key Exchange环节使用RSA或Diffie-Hellman等加密算法生成,并使用服务端的公钥对其加密后传送给服务端,服务端使用私钥解密得到PreMaster secret。

  • 主密钥(Master secret):主密钥(Master secret)用来生成各类加密算法密钥,由服务端和客户端使用PreMaster secret、客户端在Hello阶段产生的随机数、服务端在Hello阶段产生的随机数按如下规则生成:

Master secret=
MD5(premaster secret + SHA('A'  + premaster secret + ClientHello.random + ServerHello.random))+
MD5(premaster secret + SHA('BB' + premaster secret + ClientHello.random + ServerHello.random))+
MD5(premaster secret + SHA('CCC'+ premaster secret + ClientHello.random + ServerHello.random))

一文搞懂SSL/TLS
主密钥首先通过一系列散列运算生成一个足够长度的密钥块(Key Block),该密钥块的长度大于或等于SSL所需要的各类加密密钥的长度。随后SSL将该密钥块中的数据切分成各个加密密钥,如果切分完Key block 还有剩余,则直接将剩余抛弃。
一文搞懂SSL/TLS
客户端发送数据时:

  • 首先对数据附加Client write MAC key
  • 然后对数据包使用Client write encryption key加密
  • 服务端收到密文后使用Client write encryption key解密
  • 服务端使用Client write MAC key对数据的完整性进行验证

服务端发送数据时:

  • 首先对数据附加Server write MAC key
  • 然后对数据包使用Server write encryption key加密
  • 客户端收到密文后使用Server write encryption key解密
  • 客户端使用Server write MAC key对数据的完整性进行验证