面试题答案
一键面试客户端主要步骤
- 发送ClientHello消息:
- 客户端向服务器发送ClientHello消息,该消息包含客户端支持的SSL/TLS版本号、加密套件列表、压缩方法列表、随机数(ClientRandom)等信息。此随机数后续会用于生成会话密钥。
- 接收服务器响应:
- 等待服务器返回ServerHello、Certificate、ServerKeyExchange(如果需要)和ServerHelloDone消息。
- ServerHello消息:服务器从客户端提供的版本和加密套件等列表中选择合适的选项,并告知客户端。其中也包含服务器生成的随机数(ServerRandom)。
- Certificate消息:服务器向客户端发送其数字证书,该证书包含服务器的公钥等信息,用于客户端验证服务器身份。
- ServerKeyExchange消息:在某些情况下(如使用Diffie - Hellman密钥交换等非RSA密钥交换方式),服务器需要发送此消息来提供额外的密钥交换参数。
- ServerHelloDone消息:表示服务器的Hello阶段结束。
- 验证服务器证书:
- 客户端使用其信任的根证书对服务器发送的证书进行验证。验证内容包括证书是否由受信任的证书颁发机构(CA)签名、证书是否过期、证书中的域名是否与所访问的服务器域名匹配等。如果验证失败,客户端会终止连接。
- 生成预主密钥:
- 客户端生成一个48字节的预主密钥(Pre - Master Secret)。
- 加密预主密钥:
- 使用从服务器证书中获取的服务器公钥对预主密钥进行加密。
- 发送加密的预主密钥:
- 通过ClientKeyExchange消息将加密后的预主密钥发送给服务器。
- 计算会话密钥:
- 客户端根据ClientRandom、ServerRandom和Pre - Master Secret,使用约定的密钥导出函数计算出会话密钥(如用于对称加密的密钥、用于消息认证码的密钥等)。
- 发送ChangeCipherSpec消息:
- 客户端向服务器发送ChangeCipherSpec消息,通知服务器后续通信将使用新协商的加密套件和会话密钥。
- 发送Finished消息:
- 客户端使用新的会话密钥对一系列握手消息的摘要进行加密,并通过Finished消息发送给服务器,用于验证密钥交换和认证过程是否成功。
服务器端主要步骤
- 接收ClientHello消息:
- 服务器接收客户端发送的ClientHello消息,获取客户端支持的SSL/TLS版本号、加密套件列表、压缩方法列表、ClientRandom等信息。
- 发送ServerHello等消息:
- ServerHello消息:从客户端提供的选项中选择合适的SSL/TLS版本、加密套件等,并将选择结果及ServerRandom发送给客户端。
- Certificate消息:向客户端发送服务器的数字证书,以便客户端验证服务器身份。
- ServerKeyExchange消息(如果需要):对于一些非RSA密钥交换方式,服务器需要在此消息中提供额外的密钥交换参数。
- ServerHelloDone消息:告知客户端服务器的Hello阶段完成。
- 接收加密的预主密钥:
- 服务器接收客户端通过ClientKeyExchange消息发送的加密后的预主密钥。
- 解密预主密钥:
- 使用服务器的私钥对加密的预主密钥进行解密,得到Pre - Master Secret。
- 计算会话密钥:
- 服务器与客户端一样,根据ClientRandom、ServerRandom和Pre - Master Secret,使用相同的密钥导出函数计算出会话密钥。
- 发送ChangeCipherSpec消息:
- 服务器向客户端发送ChangeCipherSpec消息,表明后续通信将使用新协商的加密套件和会话密钥。
- 发送Finished消息:
- 服务器使用新的会话密钥对一系列握手消息的摘要进行加密,并通过Finished消息发送给客户端,用于验证密钥交换和认证过程是否成功。此后,客户端和服务器就可以使用新的会话密钥进行安全通信。