GIT SSH 公钥认证失败:解决 no mutual signature algorithm 问题
背景
最近在工作中需要从 Gerrit 上克隆一个项目仓库,但在使用 SSH 方式克隆时遇到了如下错误:
Permission denied (publickey).
fatal: Could not read from remote repository.尽管我已经确认 SSH 密钥已正确添加到 Gerrit,且本地文件权限也没有问题,但仍然无法连接。
问题排查过程
首先,使用以下命令尝试克隆仓库:
git clone "ssh://xxx@gerrit.xx.com:xxx/xxx"然而,系统始终返回 Permission denied (publickey) 错误。进一步排查,通过 GIT_SSH_COMMAND 启用了 SSH 的调试模式:
GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa -v" git clone "ssh://xxx@gerrit.xxx.com:xxx/xxx"在输出的日志中,我发现了一条关键信息:
debug1: send_pubkey_test: no mutual signature algorithm这条信息表明:SSH 客户端和 Gerrit 服务器之间没有共同支持的签名算法。
原因分析
查阅资料得知,这是由于 OpenSSH 8.8 及以上版本默认禁用了部分旧的签名算法(如 ssh-rsa) ,而 Gerrit 服务器(版本为 3.5.0.1)依赖的 Apache Mina SSHD 尚未完全支持新的签名算法(如 rsa-sha2-256)。
因此,客户端和服务器在握手时无法协商出一个共同支持的算法,从而导致认证失败。
✅ 解决方法
为了解决这个问题,需要手动在 SSH 客户端配置中启用兼容的签名算法。
步骤如下:
编辑或创建
~/.ssh/config文件。添加以下配置:
Host gerrit.xxx.com
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa保存后,再次尝试克隆仓库:
git clone "ssh://xxx@gerrit.xxx.com:xxx/xxx"这次克隆成功,问题得以解决!
验证连接
为了确保配置生效,可以使用以下命令手动测试 SSH 连接:
ssh -T xxx@gerrit.xxx.com -p <port>返回以下信息表示连接成功:
Welcome to Gerrit Code Review!
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Ryan的折腾日记
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果