在 gitlab 上测试 jsch 会导致无效的私钥错误



我正在尝试配置 gitlab 以在提交时运行测试,在我的测试中,我使用 SFTP ( JSch ( 像这样:

sftp = new JSch();
sftp.addIdentity(Paths.get(ClassLoader.getSystemResource("private.ppk").toURI()).toString());
//sftp.setKnownHosts("~/.ssh/known_hosts");
Session session = sftp.getSession("test", "localhost", port);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PreferredAuthentications", "publickey");
session.connect();
sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();

(port是空闲的随机端口。

这段代码,在 GitLab 环境中的运行中抛出

com.jcraft.jsch.JSchException: invalid privatekey: [B@27e47833

我完全不明白为什么,在本地运行此代码可以正常工作。我从资源加载的私钥也在我的 gitlab 存储库中。

为什么会这样?我省略了什么额外的步骤,或者为什么 gitlab 上的 Jsch 拒绝在本地运行时有效的私钥?

感谢您的帮助!

如下所述:

  • Check the PPK file and ensure that there are no obvious signs of a malformation. IE. Truncations, encoding issues, etc.
    
  • 验证 PPK 文件中的行尾.
  • 如果您正在开发项目并通过源代码版本控制系统维护代码,则您的代码可能会由使用不同操作系统和体系结构的不同协作者进行版本控制.
    由于每个操作系统处理行尾文本的方式不同(在 Linux 和 OSX 中处理为"LF", 在 Windows 中作为CRLF(,如果 PPK 文件被修改,用于确定 EOL 的字符也可能被修改,从而影响私钥的匹配。在这些情况下,定义要在源代码版本控制工具设置中使用的 EOL 字符或直接避免跟踪 PPK 文件修改非常重要。

请参阅"使用 jsch 打开 SSH 隧道时私钥无效"的评论:

至少在 0.1.53 中(我怀疑这会被删除(,它确实读取了 PPK(除了 OpenSSL PEM = 非 newfmt OpenSSH 和其他几个(,但仅限于 Windows 类型 EOL(CR LF(.
您是否通过可以更改 EOL 的方法将 PPK 复制到受影响的系统,例如粘贴到编辑器或 FTP 类型 A?

或使用 PEM 格式而不是 PPK。

最新更新