在第一次使用git存放代码时,除了倍感新鲜外,也对远程仓库的连接方式SSH产生了好奇。在这学期学完了(大概)计网后,决定开始了解该种连接方式。之所以今天才开始,主要是不想让自己一知半解地去学习新技术(绝对不是自己懒得提前看),而且现在也有想搭建一个自己的代理服务器的想法。所以,步入正题,开始介绍。
一、客户端和服务端建立连接
ps:本人偏喜图解,文字太多术语生涩有时就会让自己读不进去(惭愧惭愧)。
步骤简述:
a.客户端联系服务端,交流各自能使用的SSH版本,并约定好使用均可支持的版本.
b.服务端将自己的Host Key、加密方法和其它一些参数发给客户端(注:Host Key 分为 Public 和 Private 两种。服务端拥有 Public Key 和 Private Key,并将 Public Key 发送给客户端。客户端用 Public Host Key 验证这台服务器是否是自己要连接的服务器).
c.客户端通过Host Key验证服务端身份,双方使用 Diffie-Hellman 算法生成一致的 SessionKey
Session Key的生成
a.客户端和服务端使用沟通时的信息,协商加密算法以及一个双方都知道的数字。
b.双方各自生成只有自己才知道的 private 密码,并使用上一步中的数字进行加密,再次生成密码。
c.双方交换再次加密后的密码。
d.双方在对方发来的密码基础上,加上第二步自己的 private 密码再次加密。本次加密之后得到的结果就是在双方处都相同的 Session Key。
二、以key(还有密码)方式进行身份鉴权

步骤简述:
a.客户端用 Private Key 生成签名向服务器发起登录请求
b.服务端验证签名,检查自己有没有和这个签名匹配的 Public Key,如果有,则进入下一步。
c.服务端生成一串随机字符串,用 Public Key 加密后发送给客户端。
d.客户端用相应的 Private Key 解密这串字符串,再使用 MD5 hash 和 Session Key 加密该字符串,将结果发送给服务端。
e.服务端使用同样的 MD5 hash 和 Session Key 计算这串字符的加密结果,并和客户端发来的结果做比对,如果结果一样,则允许客户端登录。
虎头蛇尾,感谢知乎leancloud同学,提供的图解很有趣。
浙公网安备 33010602011771号