SSL/TSL 原理( 握手原理和传输原理)
本文参考《计算机网络 自顶向下方法》
背景
通信的保障可以在网络的每一层上面做,比如应用层的有安全邮件协议(PGP pretty good privacy),传输层的有ssl,网络层的有IPsec。在越底层做网络安全保障,成本就越高。
通信的4要素
- 机密性(confidentiality):仅有发送方和希望的接收方能够理解传输报文的内容。做法:....
- 报文完整性(message integrity):确保通讯过程中报文内容没有被改动。做法....
- 端点鉴别(end-point authentication):发送方与接收方都应该能证实通讯过程涉及的另一方。 做法。。。。
- 运行安全性(operational security):客户端和服务端运行的主机是安全的。
SSL/TLS in Detail
SSL协议包括两个子协议:SSL记录协议和SSL握手协议,两个协议都处于TCP之上。
SSL握手协议准许服务器端与客户端在开始传输数据前能够通过特定的加密算法相互鉴别。
SSL记录协议主要完成分组和组合, 压缩和解压缩以及消息认证和加密等功能。SSL握手协议描述安全连接建立的过程, 在客户和服务器传送应用层数据之前, 完成加密算法、密钥加密密钥算法的确定以及交换预主密钥, 最后产生相应的客户和服务器MAC秘密、会话加密密钥等功能。
通讯保证
SSL/TSL能保证通讯的3要素,机密性、报文完整性、端点鉴别。用到公开密钥密码、公开密钥密码、散列函数、数字签名。想看公开密钥、数字签名等原理,建议读者看《计算机网络 自动向下方法》或者其它文章。
MS: master secret,用于对称加密
MAC : message authentication key ,用于鉴别报文完整性。注意与链路层的MAC区别(媒体访问控制)
The Handshake Protocol
Client Server
ClientHello -------->
ServerHello
Certificate*
ServerKeyExchange*
CertificateRequest*
<-------- ServerHelloDone
Certificate*
ClientKeyExchange
CertificateVerify*
[ChangeCipherSpec]
Finished -------->
[ChangeCipherSpec]
<-------- Finished
Application Data <-------> Application Data
1. Initial Client Message to Server
Client Hello.
- Version Number. 2 for SSL 2.0 ; 3 for SSL 3.0 ;3.1 for TLS.
- Randomly Generated Data. 随机码,用于生成MS(master secret)和MAC密钥
- Session Identification (if any). 有或者无,有则客户端传上一次session的id可以恢复session
- Cipher Suite. 客户端支持的密码算法列表,供服务器选择
- Compression Algorithm. 客户端支持的压缩算法列表,供服务器选择
例子:
ClientVersion 3,1
ClientRandom[32]
SessionID: None (new session)
Suggested Cipher Suites:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
TLS_RSA_WITH_DES_CBC_SHA
Suggested Compression Algorithm: NONE
2. Server Response to Client
-
Server Hello.
- Version Number. 服务器选择的版本
- Randomly Generated Data. 随机码,用于生成MS(master secret)和MAC鉴别码。此时服务端已经可以生成自己的MS,(master secret)后面会对比客户端生成的M,用于会话加密,是对称的。MAC密钥用于鉴别报文完整性。
- Session Identification (if any). 有3种情况,1无:说明这次是新session;2新的,表明是新session,可能是服务器恢复旧session失败导致;3旧的:服务器恢复session成功,这个id与客户端给的一样。
- Cipher Suite. 服务端选择的密钥算法
- Compression Algorithm. 服务端选择的压缩算法
-
Server Certificate. 服务端的公钥证书,包含公钥
-
Server Key Exchange. 通常没有,可选的,是一个暂时用于加密客户端发送的信息。仅仅用于服务端的公钥无法对信息加密
-
Client Certificate Request. 请求客户端的公钥,可选的。
-
Server Hello Done. 说明hello结束,等待客户端回应。
server hello例子
Version 3,1
ServerRandom[32]
SessionID: bd608869f0c629767ea7e3ebf7a63bdcffb0ef58b1b941e6b0c044acb6820a77
Use Cipher Suite:
TLS_RSA_WITH_3DES_EDE_CBC_SHA
Compression Algorithm: NONE
3. Client Response to Server
- Client Certificate. 发送客户端公钥
- Client Key Exchange. 证书没问题,用双方选择的随机码生成pre-master secret,用服务端公钥加密后发送,用于会话加密,是对称密钥。
- Certificate Verify. 仅当客户端发送的自己公钥时会有。数字签名,客户端用自己私钥加密,服务端用客户端给的公钥解密,做端点鉴别。
- Change Cipher Spec. 告诉服务端已经用协商好的算法加密信息。
- Client Finished. 一段用服务端公钥以及加密信息的hash,如果服务端能解开,说明没问题
4. Server Final Response to Client
- Change Cipher Spec Message. 告诉客户端已经用协商好的算法加密信息
- Server Finished Message.
握手小结
经过上面握手,客户端与服务端都互相确认了身份,并且能够私密传输信息。其中服务端和客户端的公钥私钥是用于保证传输的随机码加密还有身份确认。当保证了随机码的加密传输,那就可以保证后来用于通讯的对称密钥的正确。最终双方共享着MS和MAC密钥
数据传输
握手之后,客户端和服务端都有了MS和MAC,他们能够通过TCP连接开始安全通讯。既然SSL/TSL是基于TCP,一种自然的思路是在TCP数据传输完之后再对数据进行验证,但如果发现有问题则可能需要重传所有数据。
其实SSL还会对数据进行分段,设信息是m,每一段信息加上MAC用于完整性检测,所以是(m,MAC);设对称密钥简称是s(不是ms,是MAC密钥),MAC = H(m+s)。这样服务端收到的是(m,H(m+s)),它通过m和s重新计算出H(m+s)与接收到的H(m+s)对比,就知道报文完整性。
应用场景
- 常见的电子网站
- 远程控制
- 数据库连接
- 邮件
小结
总的来说SSL具有强大的安全性能, 无需客户端安装额外的软件, 使用十分方便。目前应用中的SSL加密大部分只使用了单向认证, 为了提供全面的安全性, 双向认证必然会是SSL应用发展的一个趋势。