**SSL/TLS 1.2技术介绍**
TLS的实现主要分为一下几个版本:
TLS 1.0 RFC http://www.ietf.org/rfc/rfc2246.txt
TLS 1.1 RFC http://www.ietf.org/rfc/rfc4346.txt
TLS 1.2 RFC http://www.ietf.org/rfc/rfc5246.txt
TLS 1.3 见:https://blog.csdn.net/mrpre/article/details/81532469
其中我主要介绍的是RFC5245(TLS协议)
其中上图为TLS握手协议的主要过程,也是客户端与服务端完成协商秘钥对传输内容加密的过程。
Client Hello
Version:请注意,协议版本是 TLS 1.2,但是在 Record Layer 的头部 Version 字段是 TLS 1.0 (0x0301),这是因为当 Client Hello 中的版本大于 TLS 1.0 的时候,一些 TLS Server 会失败 fail 掉这个会话。而在 Handshake 的头部,Version 字段设置为了正确的 TLS 1.2。
Random:客户端随机数,我们称之为随机数 1,这个随机数是为了后面生成对称的会话秘钥。32 个字节长度。
Session ID:可选的字段。如果是第一个新的连接,则此字段没有,仅显示 Session ID Length 为 0。
Cipher Suites:加密套件
Compression Methods:压缩算法,在加密之前数据压缩。取值 00 代表不压缩。因为会弱化加密数据的安全性,所以在未来的版本已经不推荐使用了。
Extension:有很多扩展,比如 SNI 等。
Server Hello
服务端收到Client Hello后,会回复一个Server Hello,报文的内容如下:
Version:确定了 TLS 1.2
Cipher Suite:选中了其中一套 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Compression Methods:不压缩
Certificate, Server Key Exchange, Server Hello Done
Certificates:CA签发的证书,主要包括签名算法,颁发者,主题,公钥信息和签名等信息。
Server Key Exchange:其中EC Diffie-Hellman Server Params中的内容主要是传输给客户端的通过ECDHE算法生成的RSA公钥,用于将客户端即将要生成的第三随机数传输过来。
Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
通过协商好的算法、服务端的公钥、自己的私钥计算出预主密钥(如果是RSA密钥交换算法,客户端会生成第三个随机数作为预主密钥并通过服务端的公钥加密后发送给服务端)。
只有Client Key Exchange向服务端发送了数据。Change Cipher Spec, Encrypted Handshake Message是冗余信息,前者是用于告知对方后续的通信都采用协商的密钥与算法进行加密通信,后者是握手结束的信息。
客户端使用第一随机数、第二随机数和预主密钥生成最终的对称会话密钥。
Change Cipher Spec, Encrypted Handshake Message
当服务端接收了客户端的公钥后,客户端和服务端就完成了彼此的公钥交换。服务端使用同样的方式计算出相同的预主密钥(RSA交换算法使用自己的私钥解密客户端发来的预主密钥)。之后和上一步中的客户端使用两个随机数和预主密钥计算出相同的会话密钥。之后可以结束握手。
Application Data
之后客户端和服务端就会。