使用 Nix 的 Git 时权限被拒绝(公钥)

Permission denied (publickey) when using Nix's Git

我通过 Nix 安装了 Git(在 Arch Linux 上)。

[gorre@uplink ~]$ uname -a
Linux uplink 4.16.9-1-ARCH #1 SMP PREEMPT Thu May 17 02:10:09 UTC 2018 x86_64 GNU/Linux
[gorre@uplink ~]$ nix-env -q
erlang-20.3.2
git-2.16.3
go-1.10.1
google-drive-ocamlfuse-0.6.25
nix-2.0.2

我将 SSH 配置文件保存在 ~/.ssh/config:

[gorre@uplink ~]$ cat ~/.ssh/config 
# Bitbucket.org
Host bitbucket.org
#RSAAuthentication yes
IdentityFile ~/.ssh/bitbucket_id_rsa
IdentitiesOnly yes

我 100% 确定 private/public 密钥集是正确的。我一直在 SmartGit 中使用它,但是当我尝试通过命令行使用 Git 时,出现此错误:

[gorre@uplink erlang]$ git pull --rebase
sign_and_send_pubkey: signing failed: agent refused operation
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

有什么方法可以让 Git(通过 Nix 安装)引用我的 ~/.ssh/config 文件吗?


作为证明,当我 "instruct" 和 ssh-agent 临时使用我的 public 密钥时会发生这种情况(因此您可以确定我拥有正确的权限):

[gorre@uplink erlang]$ ssh-agent sh -c 'ssh-add ~/.ssh/bitbucket_id_rsa; git pull --rebase'
Enter passphrase for /home/gorre/.ssh/bitbucket_id_rsa: 
Identity added: /home/gorre/.ssh/bitbucket_id_rsa (/home/gorre/.ssh/bitbucket_id_rsa)
Already up to date.
Current branch master is up to date.

...之后,我可以自由飞行一段时间:

[gorre@uplink erlang_simple_cache]$ git pull --rebase
Already up to date.
Current branch master is up to date.

将这些调试为 ssh 故障通常比 git 故障更好。用 ssh -v -v git@bitbucket.org 诊断它们。您应该会遇到同样的错误,并且可以使用更多的诊断信息。但是我们已经有了我们需要的线索,sign_and_send_pubkey: signing failed: agent refused operationGoogling this we find it means the ssh-agent could not access that key.

IdentityFile 只说尝试哪个键,而不是尝试所有键。该密钥仍然必须可用。这就是它在您 ssh-add 之后起作用的原因,它使您的 ssh 代理可以使用密钥。通过 ssh-add 添加密钥是正确的做法。

如果每次登录都必须记住添加密钥很烦人,那么您可以使用钥匙串来安全地存储您的 ssh 密钥阶段短语。然后下次您登录时,您的钥匙串将 运行 ssh-add 为您使用缓存的钥匙串。每个 OS 上的钥匙扣都不一样。 Here's instructions for that on ArchLinux.

我遇到了相同的错误消息(在 Debian 上),但原因不同。

问题是 OpenSSH 8.8 中的 RSA SHA-1 弃用: https://www.openssh.com/txt/release-8.8(“Potentially-incompatible 变化”)。

通过生成并上传新的 ed25519 密钥解决。

使用 ssh -v git@... 调试“权限被拒绝”错误没有结果,因为来自 /nix 的 git 使用来自 /nix 的 ssh,而不是系统 ssh。 GIT_TRACE=1 git ... 输出显示实际使用的 ssh 二进制文件的路径。