简单介绍GlassFish的Client 对 Server 的单向验证。
注意:上图使用的协议为TLSv1.2, 加密算法为 ECDHE_RSA,若使用其他的协议或算法,一些步骤细节会有出入。
1) Client 发送 Hello请求
2) Server 发送 Hello响应
3) Server 发送自己的证书或证书链,包含Server的公钥及相对应CA的公钥
4) Server 通过Elliptic Curve Diffie Hellman协议生成的临时公私钥与临时签名。它将发送临时公钥 (可选,仅适用于 ECDHE 或 DHE算法) 和 Hello done消息
此时,Client需要验证Server证书(或证书链)的有效性:
首先,Client是在GlassFish上建立的,它会查看在GlassFish里的存放证书的文件,根据其官方文档(安全手册 p26) 的说明,GlassFish有两个存放证书的文件:
- cacerts.jks 包含着被GlassFish信任的CA (root 或 intermediate) 的证书,包括它们的公钥
- keystore.jks 包含着GlassFish的一些证书,包括私钥
其次,根据政府服务器发来的证书,Client 会检测此证书的CA信息,然后与cacerts.jks的对应CA信息对比,以检验刚发来的证书是否有效。
5) 若有效,则Client通过Elliptic Curve Diffie Hellman协议生成的临时公私钥。临时公钥被发送给Server,此时Client和Server同时生成相同的预主密钥(pre master secret),然后进一步的生成主密钥(master secret)
6) 7)Client现在发送一个ChangeCipherSpec记录,告诉Server,“从现在开始我发送你的所有消息都将被主密钥加密",紧接着发送Finished消息
8)Server 发送一个ChangeCipherSpec记录,告诉Client,“从现在开始我发送你的所有消息都将被主密钥加密",紧接着发送Finished消息