背景

最近在工作中需要从 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 客户端配置中启用兼容的签名算法。

步骤如下:

  1. 编辑或创建 ~/.ssh/config 文件。

  2. 添加以下配置:

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!