SSH公钥身份验证如何工作(获取右密钥)

问题描述 投票:4回答:2

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

  1. 客户端生成一对公用/专用密钥,并将公用密钥发布到服务器。
  2. 当服务器收到公共密钥身份验证请求时,它将生成随机数据,并使用客户端的公共密钥对其进行加密,然后将其发送给客户端。
  3. 客户端使用私钥解密此数据,并将其作为真实性证明发送回去。

[我希望你们中的一些人能帮助我理解当我通过SSH协议克隆任意存储库时,GitHub服务器如何知道在步骤2中选择哪个公钥?它具有数百万个用户公共密钥可供选择。而且用户可以在其计算机上安装许多私钥。

authentication github ssh cryptography
2个回答
3
投票
该协议比您想象的要复杂得多。该联机帮助页描述了客户端

tells服务器要使用的密钥:

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

relevant SSH rfc详细说明了客户端实际上通过SSH_MSG_USERAUTH_REQUEST请求发送了整个公钥。

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


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

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

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

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

您可以参考this article,了解有关在无密码SSH绰号(不提供密码和密码的公共密钥)下进行公共密钥认证的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.