SSL/TLS
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的后续版本,大家依然习惯使用SSL的叫法。
2. 协议组成
SSL协议由三部分组成:
- 握手协议:协商加密算法、MAC算法以及会话密钥
- 记录协议:对交换的数据进行加密和签名
- 警报协议:解决出现的问题
2.1 握手协议(Handshake protocol)
握手协议是客户端和服务端建立SSL连接首先执行的协议,在传输数据之前完成,服务器和客户端使用这个协议相互鉴别对方的身份、协商加密算法、MAC算法以及加密数据使用的会话密钥。
(1)建立安全能力
-
Client Hello
:客户端第一次连接到服务端时,将Client Hello
作为第一条信息发给服务端,包含了客户端支持的加密组件(cipher_suite):加密算法、压缩算法、摘要算法,以及本次连接客户端生成的随机数。若客户端期望恢复上一次的会话还需发送会话ID。 -
Server Hello
:Server 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算法参数生成的公共值,该公共值将被生成预加密主密钥。
- 若选择RSA算法,则该消息包含经RSA公钥加密的预加密主密钥(pre-master secret),其中RSA公钥为服务器证书中的公钥或
-
Certificate Verify
:该消息用于提供客户端Certificate验证,仅在具有签名能力的客户端传送 Certificate后传送。
(4)完成握手
-
Change Cipher Spec
:用于发方告知收方,发方已完成加密规范改变,准备使用协商的加密套件件(Cipher Suite)和会话密钥(Session Key)加密数据并传输了,体现在数据包中就是一个字节的数据。 -
Finished
:发方使用协商好的加密套件(Cipher Suite)和会话密钥(Session Secret)加密一段Finish
数据传送给收方,收方在收到Finishe
信息后须检查其内容是否正确,以是否成功建立加解密通道。
客户端和服务端对Finished
信息进行验证,确定加密通道已经建立成功,双方就可使用产生的会话密钥(Session Secret)加密传输数据了。
2.2 记录协议(Record Protocol)
客户端和服务端完成鉴别并确定安全信息交换使用的算法后,进入SSL记录协议,主要提供两个服务:
- 数据保密性:使用握手协议定义的秘密密钥对传送的数据加密。
- 消息完整性:使用握手协议定义的带有MAC的密钥计算消息认证码。
记录协议接收到应用程序传送的消息,将数据分片(切成容易管理的小区块),然后选择是否对这些区块作压缩,再加上此区块的消息认证码,将数据区块与MAC一起做加密处理,加上SSL记录头后通过TCP传送出去。接收数据方对数据进行解密、验证、解压缩、重组,将消息的内容还原,传送给上层应用程序。
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))
主密钥首先通过一系列散列运算生成一个足够长度的密钥块(Key Block),该密钥块的长度大于或等于SSL所需要的各类加密密钥的长度。随后SSL将该密钥块中的数据切分成各个加密密钥,如果切分完Key block 还有剩余,则直接将剩余抛弃。
客户端发送数据时:
- 首先对数据附加
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
对数据的完整性进行验证