SSH服务器如何知道要匹配哪个公钥与SSH私钥?

3

服务器的authorized_keys文件包含成千上万个密钥,服务器如何知道哪个公钥匹配当前用户的私钥?

例如,通常用户名始终为git,服务器如何知道当前用户的身份?

enter image description here

详细问题:

  • 当我使用ssh通过git pull拉取代码时,服务器如何知道git pull来自哪个用户?

  • 然后服务器如何获取与用户关联的公钥?

3个回答

7

由于公钥已经注册到GitHub 用户账户设置中,所以才能进行下一步操作。

https://github-images.s3.amazonaws.com/github-ae/assets/images/help/settings/ssh-key-paste.png

通常这类代码仓库托管服务会使用SSH 强制命令 来填充其~git/.ssh/authorized_keys

command="/path/to/script userID",\
 no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty \
 ssh-rsa <yourPublicKey>

替换为:

 ssh-rsa <yourPublicKey>

它调用一个带有你的userId和关联的公钥的脚本。 这就是GitHub将git@github.com与你的账户关联起来的方式。 在你的账户中注册公钥会修改~git/.ssh/authorized_keys中的命令和userID,而不仅仅是公钥。
当我使用ssh通过git pull拉取代码时,服务器如何知道git pull来源于哪个用户?然后服务器如何获取与该用户关联的公钥? 实际上,GitHub作为你和其之间的SSH事务的一部分获取你的公钥:然后从它的~git/.ssh/authorized_keys获取你的userID。 最后,它检查该用户是否被授权从远程仓库克隆/获取/拉取(可能是私有的,在这种情况下,用户最好是该仓库的所有者或已声明的合作者)。

1
谢谢!你解释了GitHub可以从公钥设置中获取用户ID。但是当我使用SSH进行git pull时,它如何知道git pull来自哪个用户? - Jeff Tian
1
@JeffTian 因为它从源头拉取。SSH URL 将强制 Git 使用您的公钥,在 GitHub 端进行身份验证。这已足够让 GitHub 检查您是否有权访问您想要拉取的远程存储库。 - VonC
1
@JeffTian 您可以通过设置第一个命令GIT_SSH_COMMAND="ssh -v"来查看正在发生的情况。然后执行您的git pull操作(假设origin是一个SSH URL)。 - VonC

2
简短的回答是不需要。但这个回答并不是很有帮助。假设你是一个SSH服务器,你刚拿到了一个用户名(此时总是git)和一个公钥。现在你要查看~git/.ssh/authorized_keys文件,这是一个大文件,里面包含许多由四个空格分隔的字段组成的行:选项、密钥类型、base64编码的密钥和注释(选项部分可以省略)。这里最重要的部分是base64编码的密钥,它包含了公钥和其他一些信息。现在让我们再看一下你的问题:服务器的authorized_keys文件包含数以万计的密钥,服务器如何知道哪个公钥与当前用户的私钥匹配?它不需要这样做。它现在手头上有两个公钥,它只需要匹配这两个公钥,这很容易,因为它们要么完全匹配,要么不匹配。所以此时它只需逐行扫描整个authorized_keys文件,检查:这一行是否具有相同的公钥?当然,它还需要进一步进行身份验证:仅仅拥有公钥并不能证明你就是你所声称的人。但是这已经足够进行第一次认证了。在找到(或“一个”)正确的authorized_keys文件中的行后,sshd现在可以使用选项来决定你是谁,如果你通过了其余的身份验证过程。

0

逻辑上:

  1. 当您在GitHub上注册公钥时,GitHub将把公钥与您的帐户关联。

  2. 当您尝试登录GitHub时,您会以某种方式告诉GitHub要使用哪个公钥

  3. 然后GitHub使用公钥对您进行身份验证,您需要使用私钥完成身份验证过程。

  4. 如果您通过了身份验证,GitHub将根据步骤1知道您的帐户。

SSH密钥身份验证只需在第一次明确设置密钥时使整个过程隐式化。

用户名/密码身份验证每次都是显式的。

相关:SSH公钥身份验证是如何工作的(选择正确的密钥)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接