最近被人问起了ssh key 认证的过程这个问题,之前我一直以为自己是知道的,不就是把client的PUB key加入到server的authorized_keys文件中么,感觉So easy!但是真回答的时候,就哑火了。So,我决定补上这一课。
以下内容参考互联网文章
概念
公钥(public key): 一般用来加密
私钥(private key):一般用来解密
为什么用“一般”,是因为公钥在某些情况也可以用来解密的,比如数字证书,以后再详谈。。。认证过程
假设:
Ac 代表 客户端公钥
Bc 代表 客户端密钥
As 代表 服务器公钥
Bs 代表 服务器密钥
-
会话密钥(session key)生成
- 客户端请求连接服务器,服务器将 As 发送给客户端。
- 服务器生成会话ID(session id),设为 p,发送给客户端。
- 客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
- 客户端将 r 用 As 进行加密,结果发送给服务器。
- 服务器用 Bs 进行解密,获得 r。
- 服务器进行 r xor p 的运算,获得 q。
- 至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
-
认证
- 服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端。
- 客户端使用 Bc 解密 S(x) 得到 x 。
- 客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥。
- 服务器计算 q + x 的 md5 值 m(q+x)。
- 客户端将 n(q+x) 发送给服务器。
- 服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功。