原理:
双向密钥验证的四个密钥文件:
① 客户机公钥
② 客户机私钥
③ 服务器公钥
④ 服务器私钥
1、 首先客户端发送连接请求,并发送自己的“客户端公钥”到服务器,询问服务器上是否有自己的“客户端-公钥”文件。
2、 当服务器收到客户端发送过来的连接请求和“客户端公钥”时:
① 服务器首先发送一份“服务器公钥”给客户端,并检验服务器本地是否有“客户端公钥”文件
a、如果有,服务器就验证本地的“客户端-公钥”与发送过来的公钥文件是否一致,一致则允许连接请求
b、如果没有或不一致就回送:“此公钥文件未在服务器端注册”
② 然后发送一段challenge信息(质疑信息)并用“客户端公钥”对其进行加密发送给客户端
问:为什么要用“客户端公钥进行加密呢?”
答:因为客户端只能用“客户端私钥”进行解密“客户端公钥”,要是服务器发送“服务器公钥”加密的challenge,客户端是解不开的!
3、客户端收到challenge信息之后,会使用自己的“客户端私钥”进行解密,解密之后会将该信息再次使用“服务器公钥”进行加密,然后发送给服务器
4、服务器收到之后用自己的“服务器私钥”解密该challenge信息,如果该challenge信息与自己刚开始发送出去的challenge信息一致,那么就会建立连接。
总结:
1、第1次客户端主动发起建立连接请求时,其并没有“服务器公钥文件”,直到服务器回应其才拥有“服务器公钥”
2、该challenge信息经过两次加密!第1次是服务器用“客户端公钥”进行加密发送给客户端,第2次是客户端使用“服务器公钥”进行加密发送给服务器!
3、连接建立之后,服务器端拥有“客户端公钥”文件,客户端拥有“服务器公钥文件”。在相互通信时,客户端使用“服务器公钥”进行加密,服务器使用自己的“服务器私钥”进行解密;服务器使用“客户端公钥”进行加密,客户端使用自己的“客户端私钥”进行解密。
参考来源:
尚硅谷Linux网络服务视频。