【SSH】git@gitee.com: Permission denied (publickey)

1,231 阅读3分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。

SSH 公钥想必大家应该都不陌生,不懂?那就容我稍微介绍下..

何谓公钥

  • 很多服务器都是需要认证的,ssh 认证是其中的一种。在客户端生成公钥,把生成的公钥添加到服务器,你以后连接服务器就不用每次都输入用户名和密码了。
  • 很多 git 服务器都是用 ssh 认证方式,你需要把你生成的公钥发送给代码仓库管理员,让他给你添加到服务器上,你就可以通过 ssh 自由地拉取和提交代码了。

现在大致明白公钥是怎么一回事了吧。

生成/添加公钥

接下来就是知晓怎么生成并添加公钥,我稍微花一些篇幅为大家快速演示一下(并非本文的重点),这里以 Gitee 为例:

Gitee 提供了基于 SSH 协议的 Git 服务,在使用 SSH 协议访问仓库之前,需要先配置好账户/仓库的 SSH 公钥。

你可以按如下命令来生成 ssh-key:

$ ssh-keygen -t rsa -C "xxx@xxxxxx.com"
# Generating public/private rsa key pair...

请将这里的 xxx@xxxxxx.com 换成你的邮箱,仅仅为了辨识所以使用邮箱,当然你也可以使用其他标识符。

按照提示进行三次回车(Enter),即可在 ~/.ssh/ 目录下生成对应的密钥:

查看该密钥—公钥(请务必保管好你的私钥 id_rsa,勿泄露):

然后来到 Gitee 个人账户中的安全设置——SSH公钥,将公钥发布到 Gitee:

添加后,在终端中输入:

$ ssh -T git@gitee.com

如果出现如下图,那么则添加成功,便可以使用 SSH 协议对仓库进行远程操作了!

image-20211104105903853

这种情况应该是大家喜闻乐见的。

🔥你以为结束了?不!接下来开始本章的重点,前面都是铺垫(背景知识)。

Permission denied💢

一年前我按照如上步骤进行公钥的生成/添加,也能正常地连接远程 gitee 服务器。然而,就在最近,公钥突然失效了?!

而且相当诡异的是:我的公钥同时发布到了 GitHubGitee,还能对 GitHub 进行远程操作,而 Gitee 却宣布歇了?!

我以为是公钥过期了,并重新按照以上步骤重新生成并添加 SSH 公钥到 Gitee,但错误依旧。

然后我执行了如下命令以打印

$ ssh -Tvvv git@gitee.com

最终得到如下结果(节选):

# some infos
debug1: Trying private key: /c/Users/57715/.ssh/id_dsa
debug3: no such identity: /c/Users/57715/.ssh/id_dsa: No such file or directory
debug1: Trying private key: /c/Users/57715/.ssh/id_ecdsa
debug3: no such identity: /c/Users/57715/.ssh/id_ecdsa: No such file or directory
debug1: Trying private key: /c/Users/57715/.ssh/id_ecdsa_sk
debug3: no such identity: /c/Users/57715/.ssh/id_ecdsa_sk: No such file or directory
debug1: Trying private key: /c/Users/57715/.ssh/id_ed25519
debug3: no such identity: /c/Users/57715/.ssh/id_ed25519: No such file or directory
debug1: Trying private key: /c/Users/57715/.ssh/id_ed25519_sk
debug3: no such identity: /c/Users/57715/.ssh/id_ed25519_sk: No such file or directory
debug1: Trying private key: /c/Users/57715/.ssh/id_xmss
debug3: no such identity: /c/Users/57715/.ssh/id_xmss: No such file or directory
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
git@gitee.com: Permission denied (publickey).

可惜从中我还是看不出太多有用的信息,于是为了进一步查找这一问题的原因所在,我翻阅了 GitHub 上关于此问题的大量 Issue,最终找到一些蛛丝马迹:

原来是新版本的 Git for Windows 使用的 OpenSSH 版本是 8.8,默认使用的是 RSA-SHA2 算法,而 Gitee 使用的 golang ssh 库使用的是 RSA-SHA1 算法,造成公钥验证不通过。

所以只需要在 ~/.ssh/ 下增加 config 文件,config 文件增加如下内容:

Host gitee.com 
HostkeyAlgorithms +ssh-rsa 
PubkeyAcceptedAlgorithms +ssh-rsa

这三行文本的意思是:让请求 Gitee 继续使用 RSA-SHA1 算法。

然后我们再次验证公钥:

🏆Got it!

📕题外话:目前 golang ssh 库的 RSA-SHA2 算法支持正在推进中,详见:Support RSA SHA-2 host key signatures

希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊 我们一起讨论与分享🔥