HTTPS 即 HTTP-within-SSL/TLS,其中 SSL/TLS 又分别表示: - SSL:Secure Sockets Layer
- TLS:Transport Layer Security
SSL/TLS 建立链接及握手的过程为: SSL/TLS 建立链接及握手的示意图 阶段一- Client Hello
- 客户端向服务器发送
- 随机数 Random1
- 客户端支持的加密套件 Support Ciphers
- SSL 版本
- Server Hello
- 服务器向客户端发送
- 从客户端发送加密套件列表中选择一个,加密套件决定了后续加密及生成摘要的算法
- 生成随机数Random2。两端的随机数会在后续生成对称密钥时使用。
阶段二- Certificate
- 服务器将自己的证书下发给客户端,让客户端验证服务器的身份。( 12306 曾经使用国内自己签发的证书,结果 Chrome 不认就是这个道理)
- 客户端验证后从证书取出公钥
- Server Key Exchange
- DH 算法需要此步骤,发送服务器使用的 DH参数,RSA 不需要
- Certificate Request
- 可选。服务器要求客户端上报证书。对安全性要求极高时使用。
- Server Hello Done
阶段三Certificate Verify - 客户端收到证书后从CA验证其合法性。
- 验证合法后从证书取出公钥,生成随机数 Random3
- 使用公钥非对称加密Random3 生成 PreMaster Key
Client Key Exchange - 客户端将 PreMaster Key 发送服务器,服务器用自己的私钥解出 Random3。
- 此时两端都拥有 Random 1~3
- 两端使用相同的算法生成密钥,握手结束后的数据传输都使用此密钥进行对称加密。
为何需要三个随机数? - 因为SSL/TSL 握手过程数据明文传输,多个随机数种子生成的密钥不容易暴力破解。
阶段四- Change Cipher Spec (Client)
- 这是一条事件消息
- 客户端通知服务端后续消息都会使用前面协商出来的密钥加密。
- Encrypted Handshake Message (Client)
- 这是条 Client Finish 消息
- 客户端将前面的握手消息生成摘要,使用前面协商的密钥加密。
- 这是客户端发出的第一条加密消息
- 服务端使用密钥解密,解密成功说明密钥一致。
- Change Cipher Spec (Server)
- Encrypted Handshake Message (Server)
- Server Finish 消息
- 服务端将握手过程生成摘要
- 使用密钥加密发送给客户端
- 这是服务端发送的第一条加密消息
- 客户端收到后解密,成功说明密钥一致。
相关资源 |