【问题标题】:How does ssh server know which public key to match the ssh private key?ssh 服务器如何知道哪个公钥与 ssh 私钥匹配?
【发布时间】:2021-03-02 12:19:08
【问题描述】:

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

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

详细问题:

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

  • 那么服务器如何获取与用户关联的公钥呢?

【问题讨论】:

    标签: git ssh ssh-keys


    【解决方案1】:

    因为公钥注册到GitHub user account settings

    通常,这种存储库托管服务将使用 SSH forced command 填充其~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>
    

    它使用与您的公钥相关联的用户 ID 调用脚本。

    这就是 GitHub 将 git@github.com 与您的帐户相关联的方式。
    在您的帐户中注册公钥会使用命令和用户 ID 修改 ~git/.ssh/authorized_keys,而不仅仅是公钥。

    • 当我使用ssh拉取git pull的代码时,服务器如何知道git pull来自哪个用户?
    • 那么服务器如何获取与用户关联的公钥?

    实际上,GitHub 将您的公钥作为您与 GitHub 之间的 SSH 交易的一部分:然后从其~git/.ssh/authorized_keys 获取您的用户 ID

    最后,它检查该用户是否被授权从远程存储库克隆/获取/拉取(例如,这可能是私有的,在这种情况下,用户最好是该存储库的所有者或声明的协作者)。

    【讨论】:

    • 谢谢!您解释说 github 可以从公钥设置中获取用户 ID。但是当我使用ssh到git pull时,它怎么知道git pull来自哪个用户?
    • @JeffTian 因为它是从原点提取的。 SSH URL 将强制 Git 使用 your 公钥,在 GitHub 端验证你的身份。这足以让 GitHub 检查您是否有权访问要从中提取的远程存储库。
    • @JeffTian 你可以通过先设置GIT_SSH_COMMAND="ssh -v"来查看发生了什么。然后做你的git pull(假设origin是一个SSH URL)
    【解决方案2】:

    简短的回答是它没有。不过,这个答案并不是很有帮助。

    假设您是一个 ssh 服务器,并且刚刚获得了一个用户名(此时始终为 git)和一个公钥。

    您现在查看~git/.ssh/authorized_keys,这是一个大文件,其中包含四个空格分隔的字段:

    • 选项
    • 键类型
    • base64 编码密钥
    • 评论

    (虽然选项部分可以省略)。这里的第一个重要部分是 base64 编码密钥:它由公钥和其他一些内容组成。

    现在让我们再看看你的问题:

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

    它没有。它不需要。它现在有两个公钥;它只需要匹配两个公钥,这很容易,因为它们要么逐位匹配,要么不匹配。所以此时它所要做的就是逐行扫描整个authorized_keys 文件,检查:这一行是否有相同的公钥?

    当然,它必须进一步验证:仅仅拥有公钥并不意味着你就是你声称的那个人。但这对于第一次通过就足够了。在 authorized_keys 文件中找到(或“a”)右行后,sshd 现在可以使用 options 来决定您是谁,如果您通过了其余的身份验证过程。

    【讨论】:

      【解决方案3】:

      逻辑上:

      1. 当您向 GitHub 注册您的公钥时,GitHub 将关联 您帐户的公钥。

      2. 当你尝试登录 GitHub 时,你告诉 GitHub 哪个公钥 使用in some way

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

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

      SSH 密钥身份验证只是使整个过程隐含,仅在第一次显式设置密钥时。

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

      相关:How does SSH public key authentication work (picking up right keys)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 2016-09-15
        • 2011-06-17
        • 2017-02-10
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多