V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hiwenvv
V2EX  ›  GitHub

配置 SSH 时, Github 是怎么知道我的用户名的?

  •  
  •   hiwenvv · 2023-10-24 00:33:52 +08:00 · 1740 次点击
    这是一个创建于 394 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在尝试配置 SSH 访问 Github 。我执行了下面的操作:

    1 、使用 ssh-keygen 生成一对密钥。

    2 、将 公钥传到 Github 上。

    3 、windows 启动 ssh-agent ,使用 ssh-add 添加私钥。

    操作说明告诉我:ssh -T [email protected] 来测试连接,我测试了,确实可以。

    我没有输入我的用户名,Github 是如何得到我的用户名的?

    (我以为应当使用 ssh -T [email protected] ,然而并不是)

    16 条回复    2023-10-24 15:44:57 +08:00
    duduke
        1
    duduke  
       2023-10-24 00:37:57 +08:00 via iPhone
    非对称加密和用户名有啥关系😂
    Cu635
        2
    Cu635  
       2023-10-24 00:38:47 +08:00   ❤️ 1
    ssh 鉴权的时候是看私钥和公钥能否对应,而公钥不是通过“传到 Github 上”跟用户名关联起来了么……
    leoleoasd
        3
    leoleoasd  
       2023-10-24 00:42:45 +08:00
    SSH 鉴权仅通过 public key 与 private key ;但是服务器端可以知道你用的具体哪个 key ,通过 key 来反查你的 github username
    比如你可以试一试 同一个 public key 加到两个 github 账户里,第二个应该会不让你加
    leoleoasd
        4
    leoleoasd  
       2023-10-24 00:43:17 +08:00
    SSH 鉴权通过 ssh 的 public key ; git 操作鉴权(如 private repo )等是通过你的 key 反查你的 github username 的
    nkloveni
        5
    nkloveni  
       2023-10-24 00:44:05 +08:00
    nkloveni
        6
    nkloveni  
       2023-10-24 00:45:56 +08:00
    @nkloveni 重点看这个,是 SSH 认证提供的能力,认证的时候 ssh 客户端会把自己对应的公钥发给服务端,这样服务端可以直接查表了
    leoleoasd
        7
    leoleoasd  
       2023-10-24 00:47:19 +08:00
    你本地的电脑也可以做到类似效果,比如让某一个 key 只能 sftp ,没有 shell access:

    http://man.he.net/man5/authorized_keys#:~:text=two%20is%20applied.-,command%3D%22command%22,-Specifies%20that%20the
    nyxsonsleep
        8
    nyxsonsleep  
       2023-10-24 00:56:53 +08:00
    是指没设参数自动获取计算机用户名的相关信息吧。
    hiwenvv
        9
    hiwenvv  
    OP
       2023-10-24 01:04:53 +08:00
    @leoleoasd 那么是说,github 根据我提交的私钥的信息,运算后找到了我的公钥,然后再从公钥关联的账户信息里得到用户名?

    (以我蠢笨的想法,总是以为:他要知道我的用户名,然后从我的用户配置里得到公钥,然后和私钥提交的信息进行验算)
    NauxLiu
        10
    NauxLiu  
       2023-10-24 01:26:02 +08:00
    @hiwenvv #9 有个东西叫做 [Public Key Fingerprint]( https://en.wikipedia.org/wiki/Public_key_fingerprint)
    baobao1270
        11
    baobao1270  
       2023-10-24 01:35:41 +08:00
    @hiwenvv GitHub 不知道你的私钥……你的私钥总是留在本地的
    他们数据库里有 username <-> ssh public key 的双向映射,而在 ssh 登录的时候,会自动发送公钥,所以 lookup 一下就行了
    leoleoasd
        12
    leoleoasd  
       2023-10-24 01:49:10 +08:00
    @hiwenvv 对的,这么理解没问题
    github 根据你 ssh 客户端提供的私钥相关信息(对应的公钥的指纹)找到公钥
    比如,你可以尝试命令行里 ssh -v [email protected] 会看到这样两行:

    debug1: Offering public key: 指纹
    debug1: Server accepts key: 指纹

    所以就是,客户端把公钥指纹给了服务器,服务器找到了对应的公钥,用公钥加密了一个随机字符串发给客户端并要求客户端解密
    msg7086
        13
    msg7086  
       2023-10-24 02:29:15 +08:00
    SSH 的时候客户端给服务器发送公钥指纹,服务器可以通过公钥指纹找到对应的账户。
    普通的 SSH 登录因为多个用户可以共享一个公钥指纹,所以需要你手动提供用户名才知道你连的是哪个。
    QHKZ
        14
    QHKZ  
       2023-10-24 08:12:39 +08:00 via iPhone
    git 是 GitHub 机器上的用户,和 root 是一个意义
    myname 是你自己向 MS SQL 数据库添加的一行数据,甚至连数据库用户都算不上
    hiwenvv
        15
    hiwenvv  
    OP
       2023-10-24 08:57:58 +08:00   ❤️ 1
    @leoleoasd 完全理解了,谢谢。

    “客户端把公钥指纹给了服务器,服务器找到了对应的公钥,用公钥加密了一个随机字符串发给客户端并要求客户端解密。”

    也谢谢其他各位的解答。

    感慨的是,一代代人总是被时代淘汰,我们可能会为老人不会用遥控器而着急上火,但是我自己也是不能理解 SSH 通信这很简单的过程。(对整个 github 的 key 库进行对比寻找,违背了我的陈旧认知)
    julyclyde
        16
    julyclyde  
       2023-10-24 15:44:57 +08:00
    多个用户不能用相同的 public key
    所以你就明白了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3479 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:08 · PVG 19:08 · LAX 03:08 · JFK 06:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.