据我所知,关于SSH身份验证,并且根据有关Alice和Bob的许多解释,有一些主要步骤:
[我希望你们中的一些人能帮助我理解当我通过SSH协议克隆任意存储库时,GitHub服务器如何知道在步骤2中选择哪个公钥?它具有数百万个用户公共密钥可供选择。而且用户可以在其计算机上安装许多私钥。
tells服务器要使用的密钥:
文件〜/ .ssh / authorized_keys列出了允许登录的公共密钥。何时用户登录后,ssh程序告诉服务器它要使用哪个密钥对身份验证。客户端证明其有权访问私钥,并且服务器检查相应的公共密钥被授权接受该帐户。
relevant SSH rfc详细说明了客户端实际上通过SSH_MSG_USERAUTH_REQUEST
请求发送了整个公钥。
在大多数情况下,使用公钥github应该能够查找相应的用户。我不知道当两个帐户共享一个密钥时会发生什么。
有四条信息可帮助确保SSH身份验证有效:会话ID,服务器公共密钥,客户端公共密钥和服务器上的用户名。
会话ID是在建立TCP连接之后且在验证客户端之前在密钥交换(KEX)期间创建的。会话ID保留在客户端和服务器上。当客户端通过发送SSH_MSG_USERAUTH_REQUEST
消息对服务器进行身份验证时,它会提供服务器上的用户名,客户端公钥以及使用客户端公钥解密时包含会话ID的签名。将用户名与会话ID匹配,然后建立一个安全会话,然后建立一个安全通道来执行远程git命令,就足够了。
在密钥交换期间,服务器公共密钥被提供给客户端。它存储在〜/ .ssh / known_hosts文件中。服务器签名更改时,SSH客户端将显示有关服务器凭据更改的警告,并停止身份验证过程。
您可以参考this article,了解有关在无密码SSH绰号(不提供密码和密码的公共密钥)下进行公共密钥认证的更多详细信息。