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



据我所知,根据Alice和Bob的许多解释,有一些主要步骤:

  1. 客户端生成一对公钥/私钥,并向服务器发布公钥。
  2. 当服务器接收到公钥认证请求时,生成一个随机数据,用客户端的公钥加密后发送给客户端。
  3. 客户端使用私钥解密这些数据,并将其发送回作为真实性证明。

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

协议比您想象的要复杂得多。手册描述了客户端告诉服务器它想使用哪个密钥:

文件~/。Ssh/authorized_keys列出了允许登录的公钥。当用户登录后,SSH程序告诉服务器它想使用哪个密钥对身份验证。客户端证明它有权访问私钥,服务器进行检查对应的公钥被授权接受该帐户。

相关的SSH rfc详细信息,客户端实际发送整个公钥与SSH_MSG_USERAUTH_REQUEST请求。

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

要理解SSH身份验证是如何工作的,可能有必要阅读所有与SSH 2.0相关的五个rfc: RFC4250, RFC4251, RFC4252, RFC4253和RFC4254。

有四个信息有助于确保SSH身份验证工作:会话ID、服务器公钥、客户端公钥和服务器上的用户名。

会话ID是在TCP连接建立后、客户端认证之前的KEX (key exchange)过程中创建的。会话ID同时保存在客户端和服务器上。当客户端通过发送SSH_MSG_USERAUTH_REQUEST消息对服务器进行身份验证时,它提供服务器上的用户名、客户端公钥和一个签名,其中包含使用客户端公钥解密时的会话ID。只需将用户名与会话ID匹配,然后建立一个安全会话,然后建立一个安全通道,用于执行远程git命令。

服务器公钥在密钥交换过程中提供给客户端。它存储在~/中。ssh/known_hosts文件中。当服务器签名发生变化时,SSH客户端将显示服务器凭据发生变化的警告,并停止认证过程。

您可以参考本文了解更多关于无密码SSH绰号(不提供密码和密码短语的公钥)下公钥身份验证的详细信息。

最新更新