解决了 !
一些小事情导致了这种情况
- 我最初的误解是 ssh 密钥是特定于用户的
- 在我的测试中,有两件事导致了难以理解的结果:
- 我发现我的 ssh 密码对于一个密钥不正确,但对于另一个密钥却有效(使用“$ssh-keygen -y”检查)
- 在命令行上,ssh 需要 -i 而不是 -I 来指定密钥(呃)
- 我的配置文件如建议的那样。
谢谢大家的帮助,非常感谢。
我正在使用 SSH 身份验证在本地网络上设置 Git 存储库。我按照官方 Git 网站上的说明进行操作:“服务器上的 Git - 设置服务器”
尝试找到一些背景知识以了解它应该如何工作以及为什么此设置不起作用。
我在用户工作站端运行Linux Mint 20,在Git服务器端运行CentOS 7.1。
我可以使用公钥认证user
从 到my-workstation
SSH 。gitserver
将 SSH 密钥复制user
到my-workstation
Git 用户.ssh
目录gitserver
:
root@gitserver/srv # ls -l
drwxrwx---. 7 git git 4.0K 06/01/21 08:35 git
root@gitserver/srv # ls -ld git/.ssh/
drwx------. 2 git git 28 Jan 3 12:12 git/.ssh/
root@gitserver/srv # ls -l git/.ssh/
-rw-------. 1 git git 1.8K 03/01/21 21:45 authorized_keys
git
当 SSH 认为我是使用以下命令的用户时,它将如何工作:
git remote add origin git@gitserver:/srv/git/project.git
我不明白 SSH 密钥如何user
允许用户进行 ssh 身份验证git
。
存储库的权限gitserver
适用于用户,git
而不是用户“user”。
我正在使用一个配置文件进行正常的 SSH 访问,它确实有效,也许这就是问题所在?
User alan
IdentityFile /home/alan/.ssh/my-workstation_alan-id_ed25519
IdentityFile /home/alan/.ssh/my-workstation_alan-id_rsa
IdentitiesOnly yes
Host gitserver
HostName GitserverIpAddress
这适用于正常的“非 git”访问:
$ ssh gitserver
更新:
在调查配置文件时,又出现了一些问题:
git
用户工作站上没有用户或组。在这种情况下没有.ssh/config
文件,我假设命令“$ git push origin master”以发出命令的用户身份访问 SSH 系统?- 传统意义上的权限重要吗?我认为,当存储库仅允许用户和组访问时,命令
$ git push origin master
可以访问 Git 服务器上的存储库git
?
测试:
- 尽管最初出现错误消息,但首次连接仍然成功
用户@myworkstation〜/文件/ git /测试$ ssh -I user-id_ed25519 用户@gitserver
dlopen user-id_ed25519 失败:user-id_ed25519:无法打开共享对象文件:没有此文件或目录
输入密钥“/home/user/.ssh/user-id_ed25519”的密码:
上次登录:2021 年 1 月 12 日星期二 09:15:17 来自 aa.bb.cc.dd
用户@gitserver:$退出
登出
与 aa.bb.cc.dd 的连接已关闭。
- 第二次连接没有
用户@myworkstation〜/文件/ git /测试$ ssh -I user-id_ed25519 git@gitserver
dlopen user-id_ed25519 失败:user-id_ed25519:无法打开共享对象文件:没有此文件或目录
[电子邮件保护]:权限被拒绝(公钥)。
用户@myworkstation〜/文件/ git /测试$
答案1
首先,让我们解决一个根本性的误解: ssh
钥匙是不是无论是从客户端还是服务器的角度来看,它都不是特定于用户的。无论公钥末尾的注释可能暗示什么,这都是正确的,注释通常包含生成密钥的用户的用户名。唯一重要的是您是否拥有与服务器接受的公钥相对应的私钥(例如在文件中authorized_keys
)。
打个比方,想象一下现实世界中的门和钥匙。你可以有一把实体钥匙(类似于ssh
私人的您可以使用这把钥匙打开多扇门,门上的锁也可以接受这把钥匙。您甚至可以将这把实体钥匙借给朋友,他们可以打开这扇门,尽管这是更糟计算机安全领域的想法比现实世界中的想法更有意义。
然后完成类比:
- 现实世界中的物理密钥 ==
ssh
私钥(例如id_rsa
或id_ed25519
) - 现实世界的门 ==
ssh
服务器 - 现实世界的门锁==
authorized_keys
包含一个或多个民众键(例如 的内容id_rsa.pub
)
我们可以继续类比:您可以复制您的真实世界密钥,就像您可以复制您的私钥一样,但这与您的问题无关。
就你的情况而言,你有一个 git 服务器gitserver
。你可以ssh
以用户身份访问该服务器user
,也可以使用已将相应公钥安装到该远程用户文件中的alan
任何私钥。ssh
~/.ssh/authorized_keys
现在回到您的实际问题,有几个可能的错误来源:
您提供的配置文件片段看起来很奇怪,该文件中可能存在错误。一般来说,文件中的条目
~/.ssh/config
如下所示:Host remote HostName remote.example.com User alan
虽然缩进是可选的,但大多数用户对不同的主机都有多个条目,每个条目都是一个单独的块。您还可以使用通配符来应用于多个主机,甚至所有主机,如下所示:
Host * IdentityFile /home/alan/.ssh/my-workstation_alan-id_rsa
请注意,配置文件的规范和解析发生在“第一个答案获胜“模型 - 也就是说,您需要在结尾您的文件否则事情会变得复杂并且可能无法工作。
当您说“这不起作用”时,我认为我们还没有足够的信息。如果您尝试执行如下操作:
ssh git@gitserver
这可能不会像您直观预期的那样工作(即为您提供一个交互式 shell),因为 git 服务器软件为用户设置了
git
不同gitserver
的 shell。查找/etc/password
用户的 shellgit
- 可能是类似git-shell
或 的内容gitaly
。当您尝试简单地 时ssh gitserver
,您隐式地要求获取一个交互式 shell,而常见的 git 服务器 shell(例如git-shell
)不会这样做。
建议您查看您的配置,尝试一些方法,然后更新您的问题或发布更多详细信息的其他评论。如果需要,我会修改我的答案。