面试题答案
一键面试1. 客户端Hello阶段
- 客户端操作:
- 客户端向服务器发送一个ClientHello消息,其中包含客户端支持的SSL/TLS版本号、一个随机数(Client Random)、客户端支持的密码套件列表、压缩方法列表等信息。此随机数在后续密钥生成中起重要作用。
- 服务器端操作:等待接收客户端的ClientHello消息。
2. 服务器Hello阶段
- 服务器端操作:
- 服务器收到ClientHello后,回复一个ServerHello消息。消息中包含服务器选择的SSL/TLS版本号、一个新的随机数(Server Random)、服务器从客户端提供的密码套件列表中选定的密码套件、选定的压缩方法等。
- 客户端操作:接收并解析ServerHello消息,确认服务器选择的版本、密码套件等信息是否可接受。
3. 证书交换阶段
- 服务器端操作:
- 服务器发送自己的数字证书(包含服务器的公钥等信息)给客户端,如果服务器需要对客户端进行认证,还会发送一个CertificateRequest消息,要求客户端提供证书。
- 客户端操作:
- 客户端接收服务器的证书,并验证其合法性,例如检查证书是否由受信任的证书颁发机构(CA)签发,证书是否过期等。如果服务器要求客户端证书,客户端会发送自己的证书给服务器。
4. 密钥交换阶段
- 服务器端操作:
- 如果采用RSA密钥交换,服务器使用自己的私钥对客户端发送的预主密钥(Premaster Secret)进行解密得到预主密钥。如果采用Diffie - Hellman密钥交换,服务器根据接收到的客户端参数计算共享密钥。
- 客户端操作:
- 如果采用RSA密钥交换,客户端生成一个预主密钥,使用服务器证书中的公钥加密后发送给服务器。如果采用Diffie - Hellman密钥交换,客户端根据服务器发送的参数计算共享密钥。然后客户端和服务器各自使用Client Random、Server Random和预主密钥(或共享密钥)生成会话密钥(Master Secret),再从会话密钥派生出用于加密和MAC计算的各种密钥。
5. 握手完成阶段
- 服务器端操作:
- 服务器发送一个ServerHelloDone消息,告诉客户端服务器的Hello和证书等消息发送完毕。然后使用之前协商好的密钥和算法,对一条Finished消息进行加密并发送给客户端,此消息用于校验密钥和连接的正确性。
- 客户端操作:
- 客户端接收ServerHelloDone消息后,向服务器发送一个ChangeCipherSpec消息,通知服务器后续通信将使用协商好的加密套件和密钥。接着客户端也发送一条Finished消息,同样使用协商好的密钥和算法加密,用于校验密钥和连接。服务器接收并验证客户端的Finished消息,如果验证通过,SSL握手成功,双方开始使用协商好的密钥进行安全通信。