握手流程
客户端发起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,验证二者是否相同。