Git:如何解决使用 Git 时出现“Permission denied (publickey)”错误?

1082

我正在使用Mac Snow Leopard,刚刚安装了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,但仍然出现相同的错误。


14
您尝试过通过ssh-keygen生成的公钥进行上传吗? - Patrick Cornelissen
我的问题是我尝试从sudo克隆 - 这是另一个具有不同公钥的用户。 - Vitaly Zdanevich
相同的错误。我之前通过github创建了一个公钥,然后使用ssh-keygen工具生成了另一对密钥。在个人设置中删除旧的公钥,并将我的ssh生成的id_rsa.pub密钥添加到SSH和GPG密钥中,解决了克隆权限问题。 - Tanner Dolby
如果你正在运行bash screen并且已经在所有可用的网站上完成了所有操作,那么很有可能你已经从创建screen会话的会话中注销了。一个快速的解决方法是重新启动screen会话:请参见https://superuser.com/q/180148。 - Le Sir Dog
文档中有一个页面提供了一些指导 - https://docs.github.com/en/authentication/troubleshooting-ssh/error-permission-denied-publickey - Tiago Martins Peres
ssh-add ~/.ssh/id_rsa - undefined
65个回答

1276
如果用户之前没有生成过SSH公私钥对,
这些信息适用于TheChaw,但也可应用于所有支持SSH公钥身份验证的其他git仓库。(例如[gitolite][1]、gitlab或github。)

首先,设置您自己的公私钥对。这可以使用DSA或RSA,因此基本上您设置的任何密钥都可以工作。在大多数系统上,您可以使用ssh-keygen。

  • 首先,你需要进入你的 .ssh 目录。打开终端并运行:

cd ~/.ssh && ssh-keygen

  • 接下来,你需要将其复制到剪贴板。
  • 在 OS X 上运行:cat id_rsa.pub | pbcopy
  • 在 Linux 上运行:cat id_rsa.pub | xclip
  • 在 Windows(通过 Cygwin/Git Bash)上运行:cat id_rsa.pub | clip
  • 在 Windows(Powershell)上运行:Get-Content id_rsa.pub | Set-Clipboard (感谢 @orion elenzil)
  • 通过网站将你的密钥添加到你的账户中。
  • 最后设置你的 .gitconfig。
  • git config --global user.name "bob"
  • git config --global user.email bob@... (别忘了重新启动命令行以确保配置已重新加载)

这样就可以克隆和检出了。

更多信息请参见https://help.github.com/articles/generating-ssh-keys(感谢 @Lee Whitney) [1]: https://github.com/sitaramc/gitolite

-

如果用户之前已经生成了ssh公钥/私钥对集合
  • 检查在您的github或gitlab帐户设置中已经授权的密钥
  • 确定必须与本地计算机关联的相应私钥

eval $(ssh-agent -s)

  • 定义密钥的位置

ssh-add ~/.ssh/id_rsa


10
好的,这实际上不是一个git问题,而是一个ssh同步问题。我在Assembla上遇到了同样的问题,你提供的链接帮助我解决了它。谢谢! - Alexandre Bourlier
7
我遇到了一个关于密钥生成器的问题。它对全局环境变量中的电子邮件地址非常敏感。如果你也遇到了这个问题,你需要在第一步中指定你的Github账户的电子邮件地址: ssh-keygen -t rsa -C "your_email@youremail.com" - melchoir55
86
如果仍无法解决问题,您需要执行“ssh-add ~/.ssh/id_rsa”命令。 - Michael Litvin
2
在Linux上使用xclip进行复制只需要执行以下命令:xclip -sel clip < ~/.ssh/id_rsa.pub,具体步骤可以参考这里:https://help.github.com/articles/generating-ssh-keys - Pat Migliaccio
1
如果您正在使用PowerShell,则可以使用“cat id_rsa.pub | Set-Clipboard”将其复制到剪贴板,或者更加PowerShell风格的“Get-Content id_rsa.pub | Set-Clipboard”。 - orion elenzil
显示剩余22条评论

312

2
我的问题与服务器密钥不同有关。一旦我使用上述命令确定了问题,我就在配置文件中修复了IdentifyFile,然后它就可以工作了。 - Jarie Bolander
2
显示了 Github 尝试使用哪个密钥进行身份验证。非常有帮助。 - cdosborn
61
这并没有解决任何问题。我仍然会在原贴中遇到错误。 - IgorGanapolsky
27
这个命令可以帮助您解决问题,但并非神奇的一键修复功能。 - Stephan Kristyn
3
我不能说这解决了什么问题,但这是一个非常有趣的命令,并且也适用于 GitHub 企业版。 - Hack-R
显示剩余13条评论

228

当您访问SSH URL(读/写)而没有对该仓库的写入权限时,可能会出现此错误。

有时,您只想克隆自己的代码库,例如部署到服务器。在这种情况下,您实际上只需要READ-ONLY权限。但是,如果这是您的首选项,GitHub可能会显示SSH URL作为“您自己的” 代码库。在这种情况下,如果您的远程主机公钥不在您的GitHub SSH密钥中,则将拒绝您的访问,这是可以预期的。

另一种情况是,您尝试使用SSH URL克隆其他人的代码库,但您无权对其进行写入。

总之,如果您只想克隆代码库,请使用HTTPS URLhttps://github.com/{user_name}/{project_name}.git)而不是SSH URL(git@github.com:{user_name}/{project_name}.git),这避免了(不必要的)公钥验证。


更新:GitHub现在将HTTPS显示为默认协议,这可能会减少SSH URL的可能误用。


使用 https://github.com git url 时,仍然会出现 SSL certificate problem: self signed certificate in certificate chain 的问题。使用 git -c http.sslVerify=false clone ... 命令似乎是一种危险的做法。但是在 Chrome 中并没有出现任何 SSL 警告。你有什么想法? - Jason Kleban
1
@uosɐſ 抱歉,我从未遇到过这个问题。也许第一件要做的事情是尝试在另一台机器上执行相同的命令,看看问题是否仍然存在。 - kavinyao
2
这对我也有用。谢谢。为了将我的git repo克隆到我的共享托管帐户(1and1)上,我必须使用git clone https://github.com/MyUserName/MyRepo.git只需单击Github页面右侧repo URL下方的文本链接,即可在“_You can clone with HTTPS、SSH或Subversion._”处进行操作。(单击_HTTPS_以获取链接,而不是默认的_SSH_。) - Oliver Schafeld
我曾经遇到过完全相同的问题;我有一个公共仓库的写入权限,使用 SSH 密钥,但需要只读权限来克隆 LFS 对象。将 SSH 地址替换为 HTTPS URL 解决了我的问题。 - Professor Nuke
2
我不明白为什么 SSL URL 需要读和写权限才能克隆? - leopoodle

178

GitHub帮助 链接 帮我解决了这个问题。看起来ssh密钥没有添加到ssh代理中。这就是我最终所做的。

命令1:

确保启用了ssh代理。该命令在后台启动ssh代理:

eval "$(ssh-agent -s)"

命令2:

将您的SSH密钥添加到ssh-agent中:

ssh-add ~/.ssh/id_rsa

7
我升级操作系统从OSx El Capitan到Sierra后,这个方法对我有效。 - Louwki
这个方法在树莓派上对我起作用了,因为ssh-add命令的参数是"-k",而不是"-K"。但是一旦我添加了我的部署密钥,就能够成功地使用SSH链接克隆我的仓库。 - Josh
3
这是真正的解决方案,并且在4年后(于Jan 11 '19)被复制粘贴到了被接受的答案中,因此它值得我们所有人的点赞! - CPHPython
https://dev59.com/fGMm5IYBdhLWcg3wIsQ2。看看这里是否有相关内容,或者重启系统并查看是否可行。 - jarora
将SSH密钥添加到ssh-agent中解决了我的问题! - Keivan Ipchi Hagh
显示剩余3条评论

117

在 Windows 上还有另一种可能性,这不在任何这些答案中提到,也没有在 git 或 github 的故障排除文档中提到:

git 可能正在使用与您认为的不同的 openssh 可执行文件。

当尝试从 github 和 ssh.dev.azure.com 克隆或拉取时,我收到了 Permission denied (public key) 错误,并且我已经按照所有说明进行了操作,并验证了我的 SSH 密钥设置正确(从 SSH 的角度来看)使用 ssh -vT git@github.comssh -vT git@ssh.dev.azure.com。但仍然出现这些错误:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

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

我最终发现问题在于,Git for Windows和Windows都有各自的openssh版本。这里有相关文档:https://github.com/desktop/desktop/issues/5641

我原先依赖于Windows ssh-agent服务来存储我的ssh密钥密码,因此git(带有它自己的openssh版本)无法读取我的私钥。我认为使用这个错误信息是一个缺陷 - 它是误导性的。

修复方法如下:

git config --global core.sshCommand "'C:\Windows\System32\OpenSSH\ssh.exe'"

或者在您的~/.gitconfig文件中:

[core]
    sshCommand = 'C:\\Windows\\System32\\OpenSSH\\ssh.exe'
也许这个问题很快就会在 Windows 版的 git 中得到解决,但这已经是我第二次因此浪费时间了。

或者,如果您同时使用Cygwin git并希望保留“~/.gitconfig”,则可以修改C:\Program Files\Git\etc\gitconfig - yurez
这个问题在win11上仍然存在(至少在从win10升级后)。感谢解决方案!文档无法帮助解决它。 - Trofogol
3
在安装过程中选择“使用外部OpenSSH”而不是默认选项“使用捆绑的OpenSSH”。 - Ethan
1
我也成功在Mac上运行了它。只需在Mac中放置正确的ssh路径即可。对我来说,它是“/usr/bin/ssh”。 - Ninja-aman
1
非常感谢你,你救了我的一天。 - Christian
显示剩余6条评论

104

我曾经遇到过同样的问题,这是我做的,然后我成功克隆了那个repo。以下是我在Mac上执行的操作。

第一步:检查我们是否已有公共SSH密钥。

  1. 打开终端。
  2. 输入ls -al ~/.ssh以查看是否存在现有的SSH密钥:

检查目录列表,以查看您是否已经拥有公共SSH密钥。默认的公共密钥是以下之一:d_dsa.pub,id_ecdsa.pub,id_ed25519.pub,id_rsa.pub。

如果没有找到,则进入第2步,否则请按照第3步操作。

第二步:生成公共SSH密钥

  1. 打开终端。
  2. 输入以下命令,并使用您用于github的有效电子邮件地址:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  3. 您将在终端中看到以下内容:Generating public/private rsa key pair。当提示“输入要保存密钥的文件”的时候,按回车键。这将接受默认文件位置。当提示“输入要保存密钥的文件(/Users/you/.ssh/id_rsa): [Press enter]”时,只需再次按回车键即可。
  4. 在提示符下,“Type a secure passphrase. Enter passphrase (empty for no passphrase): [Type a passphrase]”,如果您不想要,请按回车键 Enter same passphrase again: [Type passphrase again]再次按回车键。

这将生成id_rsa.pub

第三步:将您的SSH密钥添加到ssh-agent中

  1. 在终端中输入eval "$(ssh-agent -s)"

  2. 向ssh-agent添加您的SSH密钥。 如果您正在使用现有的SSH密钥而不是生成新的SSH密钥,则需要在命令中用现有私钥文件的名称替换id_rsa。 输入此命令$ ssh-add -K ~/.ssh/id_rsa

  3. 现在复制SSH密钥,并将其添加到您的github帐户中。

  4. 在终端中输入此命令,其中包含您的ssh文件名pbcopy < ~/.ssh/id_rsa.pub 这将把文件复制到您的剪贴板中,现在打开您的github帐户,进入Settings > SSH and GPG keys > New SSH key,输入标题并将密钥从剪贴板粘贴到那里,并保存。好了,您完成了。


6
Windows 用户复制 SSH 公钥的命令:cat ~/.ssh/id_rsa.pub | clip。 - Fabii
4
最终,在花费一个小时在这里和那里阅读之后,逐步解决方案......非常好用。请记得在步骤中将您的 GitHub 密码添加为口令,否则每次都必须手动添加。 - Afshin Ghazi
很好的回答。我想补充一点,获取有关如何更改远程git详细信息的信息对我很有帮助--请参阅此链接获取详细信息:https://dev59.com/173pa4cB1Zd3GeqPYSNq#63830575 - Mike
谢谢!这对我很有帮助,不过: 我运行的是ssh-add ~/.ssh/id_rsa,而不是ssh-add -K ~/.ssh/id_rsa。 "-K"选项会提示输入PIN码,而我没有。 - StvnBrkdll
从macOS Ventura开始,必须使用ed25519而不是RSA。 - Flair
显示剩余3条评论

104

收到了同样的错误报告。

使用 HTTPS 协议而不是 SSH 协议进行修复。因为我不想为测试电脑设置 "SSH 密钥"。

克隆时将 URL 更改为 HTTPS:

git clone https://github.com/USERNAME/REPOSITORY.git

我的问题有点不同:我在将现有本地 repo 添加到远程时,将 URL 设置为 SSH,方法如下:

git remote add origin ssh://github.com/USERNAME/REPOSITORY.git

为了解决这个问题,请将URL重置为 HTTPS:

git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

顺便提一下,您可以使用以下命令检查您的URL:

git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
origin  https://github.com/USERNAME/REPOSITORY.git (push)

希望这能帮到像我一样的人。:D


我是这样做的。一切都很顺利,直到我想推送一个修改后的提交...但它失败了。我被卡住了,因为没有新的提交可以使用,因为它受到保护,防止这种活动。 - Mykola Tetiuk
谢谢!不确定为什么我的存储库突然配置为SSH,我之前只使用过HTTPS,所以很高兴你提出了这个修复方案。 - A__

46

这对我有效:

ssh-add ~/.ssh/id_rsa

无法打开到您的身份验证代理的连接。 - CS QGB
1
谢谢,它起作用了。为了解释相同的步骤,我在我的回答中添加了一个逐步的方法。 - officialrahulmandal

37

可视化指南(Windows)

1 of 2. Git 批处理

1.1. 打开 git 批处理(下载 这里enter image description here

1.2. 粘贴 下面的文本(将其更改为您的 GitHub 帐户电子邮件)

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

enter image description here

1.3. 按下 Enter 键(接受默认文件位置) enter image description here

1.4. 点击两次 Enter 键(或设置SSH密钥密码 - Gitbub passphrases docs

> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

1.5. 密钥生成:

您的身份验证信息已保存在 /c/Users/user/.ssh/id_rsa...

1.6. 复制 SSH 密钥到剪贴板。

$ clip < ~/.ssh/id_rsa.pub

2 of 2. Github 网站用户端

用户设置enter image description here

SSH 和 GPG 密钥 => 新建 SSH 密钥: enter image description here

粘贴 步骤 1.6 中的代码 enter image description here

完成 :)

enter image description here


如果有人不想使用 SSH,可以使用 HTTPS:

enter image description here

Github文档: https://docs.github.com/zh/github/authenticating-to-github/connecting-to-github-with-ssh


31

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

截至本文发布时(2021年10月),Windows版Git的最新版本为2.33.1(发行说明),它已经采用了最新的OpenSSH 8.8p1(发行说明),而OpenSSH 8.8p1则弃用了SHA-1。同时,如果您的远程Git存储库仍然使用SHA-1,则会导致身份验证失败。

要查看您是否遇到了这种情况,请检查软件的版本:

ssh -V
git --version

如果您想了解更多有关IT技术的内容,您可以查看OpenSSH 8.8/8.8p版本发布说明中的“可能不兼容更改”部分。

简而言之:

解决方案1:通过将以下内容添加到您的~/.ssh/config文件中,启用SHA-1:

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

请记得将<remote>替换为您的远程仓库主机名。

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

ssh-keygen -t ecdsa -C <comment>

请记得用您自己的助记词替换<comment>。然后,将生成的公钥上传到您的远程仓库。


顺便提一下,我在访问Gitee.com时遇到了这个提示信息。他们在服务器上使用golang.org/x/crypto/ssh,并在这个问题上发布了一个页面,您可以在这里查看(中文)。

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

我使用了解决方案2。现在我能够访问远程仓库了。非常感谢。该解决方案适用于配置为Git ssh而不是嵌入式的Git、TortoiseGit和SourceTree。 - Alfira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接