我用的是Mac雪豹,刚刚安装了git。

我只是试了

git clone git@thechaw.com:cakebook.git

但这给了我这个错误:

Initialized empty Git repository in `/Users/username/Documents/cakebook/.git/`
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

我错过了什么? 我也试过做ssh-keygen没有密码,但仍然错误。


当前回答

在我的MAC中,我解决了这个问题:

cp ~/.ssh/github_rsa ~/.ssh/id_rsa

出于某种原因,我的git停止在github_rsa文件中寻找私钥。这发生在一次特定的回购中。我的意思是在其他存储库中git保持正常工作。

我想这是个bug。

我可以在运行ssh -vT git@github.com时发现这种行为

其他回答

总是检查github ssh密钥生成程序,而不是一些过时的博客

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

在这里你可以看到键是通过以下方式生成的:

ssh-keygen -t ed25519 -C "your_email@example.com"

所以算法是ed25519而不是rsa或者别的什么。

github帮助链接帮助我解决了这个问题。看起来ssh密钥没有添加到ssh-agent。这就是我最后做的事。

命令1:

确保ssh-agent已启用。在后台启动ssh-agent:

eval "$(ssh-agent -s)"

命令2:

将SSH密钥添加到SSH -agent:

ssh-add ~/.ssh/id_rsa

在我的例子中,这个奇怪的错误是gnome-keyring-daemon错误地命名了需要密码的密钥的症状。

我按照这里列出的步骤,并通过终端输入密码。这个错误,也就是混乱的GUI界面,已经解决了。 参见:https://askubuntu.com/questions/3045/how-to-disable-gnome-keyring

让我也分享一下我的经验,

我试图从Gerrit回购中克隆一些项目,我在帐户设置中获得了我的公钥。

在第一次尝试克隆git时,我得到了以下错误:

Unable to negotiate with XX.XX.XX.XX port XXX: no matching key exchange
method found. Their offer: diffie-hellman-group1-sha1

我发现我需要通过SSH选项-oKexAlgorithms=+diffie-hellman-group1-sha1以某种方式来git克隆。

希望GIT_SSH_COMMAND环境变量完成了这项工作:

export GIT_SSH_COMMAND="ssh -oKexAlgorithms=+diffie-hellman-group1-sha1"

但是git克隆仍然没有开始工作。现在它抛出(关于主题):

Permission denied (publickey).

我已经得到SSH密钥,不想重新生成它们。我检查了普通的SSH连接到主机,它是ok的:

****    Welcome to Gerrit Code Review    ****

  Hi XXXXX, you have successfully connected over SSH.

  Unfortunately, interactive shells are disabled.
  To clone a hosted Git repository, use:

  git clone ssh://xxxxx@xx.xx.xx:xxx/REPOSITORY_NAME.git

我有点困惑。我重新开始并通过-vvv选项打开SSH的调试。我看到了下面这些:

debug1: read_passphrase: can't open /dev/tty: No such device or address

可能,这是GIT_SSH_COMMAND env变量的开销-我的密钥是用passphrase保护的(我在检查登录到git repo主机时输入了它)。

所以,我决定去掉这个短语。一个简单的命令帮助了我:

ssh-keygen -p

然后,我输入了我的“旧密码”的密码短语,并在“新密码”上按了两次ENTER键,让它空着,即根本没有密码短语,并确认我的选择。

之后,我在本地磁盘上获得了新克隆的回购。

如果你的问题最近突然出现(2021年下半年),这可能是由不兼容的哈希算法引起的。

截至本文(2021年10月),Git for windows的最新版本是2.33.1(发布说明),它已经采用了最新的OpenSSH 8.8p1(发布说明),而OpenSSH 8.8p1反过来已经弃用了SHA-1。同时,如果远程Git存储库仍然坚持SHA-1,则身份验证将失败。

要看看你是否会陷入这种情况,检查你的软件版本:

ssh -V
git --version

然后,您应该检查OpenSSH 8.8/8.8p发行说明中的“潜在不兼容更改”部分。

博士TL;

解决方案1:通过将此添加到~/中,再次启用SHA-1。ssh /配置文件:

Host <remote>
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

请记住将<remote>替换为远程存储库的主机名。

解决方案2:使用ECDSA或Ed25519而不是RSA重新生成密钥对。例如:

ssh-keygen -t ecdsa -C <comment>

记住用你自己的助记短语替换<comment>。然后,将生成的公钥上传到远程存储库。


供你参考,我在访问Gitee.com时遇到了这个提示信息,Gitee.com在他们的服务器上使用golang.org/x/crypto/ssh,并在这里发布了一个关于这个问题的页面(中文)。

git@gitee.com: Permission denied (publickey).