握手流程
客户端发起https请求
客户端告诉服务端支持哪些加密算法。-
服务端响应
- 选择合适的加密算法(比如:RSA、AES、MD5);
- 将
CA证书数字签名和服务端公钥返回给浏览器。
-
客户端验证服务端数字签名,发送秘钥给服务端
- 验证服务端返回的
数字签名; - 生成一个随机数
a,作为AES加密秘钥,使用服务端公钥对a加密,得到b; - 生成握手消息,以
a为秘钥对其进行AES加密,得到c; - 计算握手消息的HASH值,得到
d; - 将
b、c和d发送到服务端。
- 验证服务端返回的
-
服务端确认加密秘钥
- 使用
服务端私钥解密b,得到a; - 以
a为秘钥对c进行AES解密,得到握手消息; - 计算握手消息的HASH,验证其与
d是否一致; - 生成新的握手消息,以
a为秘钥对其进行AES加密,得到e; - 计算新握手消息的HASH值,得到
f; - 将
e和f返回给浏览器。
- 使用
-
握手过程完成,客户端发送加密数据给服务端
- 以
a为秘钥对e进行AES解密,得到新握手消息; - 计算新握手消息的HASH,验证其与
f是否一致; - 至此,握手过程结束。之后所有的通信数据将以
a为秘钥进行AES加密后传输。
- 以
客户端验证服务端数字签名的流程
获取对应CA证书颁发机构的公钥
根据数字签名信息,获取对应CA证书颁发机构的公钥。
该公钥是被根证书颁发机构,使用其私钥加密过的。解密并获得CA证书颁发机构的公钥
使用本地根证书公钥,解密并获得CA证书颁发机构的公钥。
本地根证书公钥是在用户安装操作系统时,由操作系统写入浏览器的。解密数字签名,验证服务端公钥
使用CA证书颁发机构的公钥,解密数字签名,得到服务端公钥的HASH。
计算服务端公钥的HASH,验证二者是否相同。