最近一直在研究SSH在github的验证原理,事情起源于公司一小兄弟的webstorm在无任何改动的情况下和github连接验证失败,详见以前的文章《webstorm无法连接github报You‘re are using an RSA key with SHA-1, which is no longer allowed.》。由此衍生出一个疑问:github后台是如何匹配git客户端发上来的连接请求,从而找到账户内设置的公钥,再通过公钥进行加密的?
1)A同学说:客户端在第一次请求时把.ssh目录下的id_rsa.pub公钥文件上送到github,github到公钥库内匹配找到以前维护的公钥。可事实上,你把id_rsa.pub文件删除,然后用ssh -T git@github.com
命令测试,仍可以验证通过。所以上送公钥的说法不成立。
2)B同学说:客户端在生成密钥对的时候,将客户端硬件识别信息(诸如MAC)加入到了公钥中,在验证链接时将此信息发送到了github,github通过这个信息匹配到公钥。可实际上是,你把id_rsa私钥文件复制到其他机器上做测试,仍可以验证通过。所以这种说法也不成立
3)C同学说:客户端在用ssh-keygen -t rsa -C "test@163.com"
命令生成密钥对的时候,在C参数后跟了个邮箱名,这个邮箱名必须和github的注册用户邮箱一致,所以在连接时会匹配到这个邮箱,找到对应的公钥。可经过试验,你改成任何一个邮箱或者字符串,连接仍旧测试成功。事实上这个C参数只是一个密钥对的备注信息