SSH公钥认证如何工作(选择正确的密钥)

时间:2014-05-10 11:09:48

标签: authentication github ssh cryptography

据我所知,关于SSH身份验证,根据Alice和Bob的许多解释,有一些主要步骤:

  1. 客户端生成一对公钥/私钥,并将公钥发布到服务器。
  2. 当服务器收到公钥认证请求时,它会生成随机数据,使用客户端的公钥对其进行加密并将其发送给客户端。
  3. 客户端使用私钥解密此数据,并将其作为真实性证明发回。
  4. 我希望有些人帮助我理解当我通过SSH协议克隆任意存储库时,GitHub服务器如何知道在步骤2中选择哪个公钥? 它有数百万用户公钥可供选择。并且用户可以在他的机器上安装许多私钥。

2 个答案:

答案 0 :(得分:3)

该协议比您想象的要复杂得多。该联机帮助页描述了客户端告诉服务器要使用哪个密钥:

  

文件〜/ .ssh / authorized_keys列出了允许登录的公钥        用户登录时,ssh程序告诉服务器它想要使用哪个密钥对        认证。客户端证明它可以访问私钥并且服务器检查        相应的公钥被授权接受该帐户。

客户端实际使用SSH_MSG_USERAUTH_REQUEST请求实际发送整个公钥的relevant SSH rfc详细信息。

使用公钥github应该能够在大多数情况下查找相应的用户。不过,我不知道当两个帐户共享密钥时会发生什么。

答案 1 :(得分:0)

要了解SSH身份验证的工作原理,可能需要阅读与SSH 2.0相关的所有五个RFC:RFC4250RFC4251RFC4252RFC4253RFC4254

有四条信息可帮助确保SSH身份验证有效:会话ID,服务器公共密钥,客户端公共密钥以及服务器上的用户名。

在建立TCP连接之后和认证客户端之前,在密钥交换(KEX)期间创建会话ID。会话ID保留在客户端和服务器上。当客户端通过发送SSH_MSG_USERAUTH_REQUEST消息对服务器进行身份验证时,它会提供服务器上的用户名,客户端公共密钥以及使用客户端公共密钥解密时包含会话ID的签名。将用户名与会话ID匹配,然后建立一个安全会话,然后建立一个安全通道来执行远程git命令,就足够了。

在密钥交换期间,服务器公共密钥被提供给客户端。它存储在〜/ .ssh / known_hosts文件中。当服务器签名更改时,SSH客户端将显示有关服务器凭据更改的警告,并停止身份验证过程。

有关无密码SSH昵称(不提供密码和密码的公共密钥)下的公共密钥身份验证的更多详细信息,请参考this article