我在尝试配置 SSH 访问 Github 。我执行了下面的操作:
1 、使用 ssh-keygen 生成一对密钥。
2 、将 公钥传到 Github 上。
3 、windows 启动 ssh-agent ,使用 ssh-add 添加私钥。
操作说明告诉我:ssh -T [email protected] 来测试连接,我测试了,确实可以。
我没有输入我的用户名,Github 是如何得到我的用户名的?
(我以为应当使用 ssh -T [email protected] ,然而并不是)
1
duduke 2023-10-24 00:37:57 +08:00 via iPhone
非对称加密和用户名有啥关系😂
|
2
Cu635 2023-10-24 00:38:47 +08:00 1
ssh 鉴权的时候是看私钥和公钥能否对应,而公钥不是通过“传到 Github 上”跟用户名关联起来了么……
|
3
leoleoasd 2023-10-24 00:42:45 +08:00
SSH 鉴权仅通过 public key 与 private key ;但是服务器端可以知道你用的具体哪个 key ,通过 key 来反查你的 github username
比如你可以试一试 同一个 public key 加到两个 github 账户里,第二个应该会不让你加 |
4
leoleoasd 2023-10-24 00:43:17 +08:00
SSH 鉴权通过 ssh 的 public key ; git 操作鉴权(如 private repo )等是通过你的 key 反查你的 github username 的
|
5
nkloveni 2023-10-24 00:44:05 +08:00
|
6
nkloveni 2023-10-24 00:45:56 +08:00
@nkloveni 重点看这个,是 SSH 认证提供的能力,认证的时候 ssh 客户端会把自己对应的公钥发给服务端,这样服务端可以直接查表了
|
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 |
8
nyxsonsleep 2023-10-24 00:56:53 +08:00
是指没设参数自动获取计算机用户名的相关信息吧。
|
9
hiwenvv OP @leoleoasd 那么是说,github 根据我提交的私钥的信息,运算后找到了我的公钥,然后再从公钥关联的账户信息里得到用户名?
(以我蠢笨的想法,总是以为:他要知道我的用户名,然后从我的用户配置里得到公钥,然后和私钥提交的信息进行验算) |
10
NauxLiu 2023-10-24 01:26:02 +08:00
@hiwenvv #9 有个东西叫做 [Public Key Fingerprint]( https://en.wikipedia.org/wiki/Public_key_fingerprint)
|
11
baobao1270 2023-10-24 01:35:41 +08:00
@hiwenvv GitHub 不知道你的私钥……你的私钥总是留在本地的
他们数据库里有 username <-> ssh public key 的双向映射,而在 ssh 登录的时候,会自动发送公钥,所以 lookup 一下就行了 |
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: 指纹 所以就是,客户端把公钥指纹给了服务器,服务器找到了对应的公钥,用公钥加密了一个随机字符串发给客户端并要求客户端解密 |
13
msg7086 2023-10-24 02:29:15 +08:00
SSH 的时候客户端给服务器发送公钥指纹,服务器可以通过公钥指纹找到对应的账户。
普通的 SSH 登录因为多个用户可以共享一个公钥指纹,所以需要你手动提供用户名才知道你连的是哪个。 |
14
QHKZ 2023-10-24 08:12:39 +08:00 via iPhone
git 是 GitHub 机器上的用户,和 root 是一个意义
myname 是你自己向 MS SQL 数据库添加的一行数据,甚至连数据库用户都算不上 |
15
hiwenvv OP @leoleoasd 完全理解了,谢谢。
“客户端把公钥指纹给了服务器,服务器找到了对应的公钥,用公钥加密了一个随机字符串发给客户端并要求客户端解密。” 也谢谢其他各位的解答。 感慨的是,一代代人总是被时代淘汰,我们可能会为老人不会用遥控器而着急上火,但是我自己也是不能理解 SSH 通信这很简单的过程。(对整个 github 的 key 库进行对比寻找,违背了我的陈旧认知) |
16
julyclyde 2023-10-24 15:44:57 +08:00
多个用户不能用相同的 public key
所以你就明白了吧 |