抓包后,可以明显看到mtls包含四个过程:
1.Client Hello
客户端向服务端“打招呼”,并传输过去一个随机数(明文,大家都可以看见),这个随机数也就是下面的random,将被作为会话秘钥的一部分。会话秘钥为client端和server端在经历四步后一起制作出来的密钥,在双方都制作出相同的会话密钥后会使用对称加密的方式来传递信息(在制作会话密钥的时候是使用非加密方式)。
Cipher Suites指明自己支持的对称加密、非对称加密和数字签名算法(16种),会提供给服务端,让服务端选择其中一种进行交流。
2.Server Hello,Certificate,Certificate Request,Server Hello Done
1)Server Hello
与Client Hello类似,主要为向客户端传递random随机数(明文),此时client与server同时拥有两个随机数,这两个数将作为后续会话秘钥的一部分。Cipher Suite为Server端向Client端指明的算法(“二人”约定好的,要一起使用,这里是RSA非对称加密算法)
2)Certificate
该证书为Server端向Client端提供的Server证书,mtls与tls主要的区别即为“m(mutual)”,mtls需要双方都提供证书,而tls只需要server证书提供给client(Server证书中含有Server的公钥)
3)Certificate Request
Server端让Client端发来Client的证书
4)Server Hello Done
Server端向Client端发送的消息结束
3.Certificate,Client Key Exchange,Certificate Verify,Change Cipher SPec,Encrypted Handshake Message
1)Certificate
Client端向Server端提供的证书
2)Client Key Exchange
此时,Client端向Server端传入(对于双方来说)第三个随机数,但该随机数不是明文的,是被Client端用Server端公钥加密过的,当Server端用Server端的私钥解密后,双方都会有第三个解密后的随机数,2字节的protocalversion和26字节的随机数构成了预备主密钥。client_random和server_random和预备主密钥一起构成了会话秘钥。
3)Certificate Verify
Client端验证Server端证书是否可信(Server端证书需要CA机构来验证,CA拥有自己的公钥和私钥,CA先用自己的私钥对Server端公钥与其他信息进行“加密”,操作系统中有关于CA公钥的信息,Client端会用CA公钥对Server端公钥及其他信息进行“解密”,解密出来后的信息与Server端发过来的证书进行比对,如果一致,则确认Server端发来的证书可信)
4)Change Cipher SPec
告知Server端采用协商的密钥进行加密通信(在第四步Server端对Client端同样会发该信息来回应Client)
5)Encrypted Handshake Message
客户端将前面的握手消息生成摘要,再用双方都有的会话密钥进行加密,传递给服务端,如果服务端可以解密且与之前的握手信息对应,则密钥一致
4.Change Cipher SPec,Encrypted Handshake Message
1)Change Cipher SPec
Server端向Client端回复收到了改变加密通信方式的消息
2)Encrypted Handshake Message
服务端将前面的握手消息生成摘要,再用双方都有的会话密钥进行加密,传递给客户端,如果客户端可以解密且与之前的握手信息对应,则密钥一致