gpt4 book ai didi

java - 使用 JSch 时为 "Invalid privatekey"

转载 作者:行者123 更新时间:2023-12-01 22:47:00 52 4
gpt4 key购买 nike

我正在使用以下代码在 Java 应用程序中使用 Git。我有一个有效的 key (一直使用它),并且这个特定的代码之前使用相同的 key 和 git 存储库对我有用,但现在我得到以下异常:

invalid privatekey: [B@59c40796.

在这一行:

jSch.addIdentity("<key_path>/private_key.pem");

我的完整代码:

    String remoteURL = "ssh://git@<git_repository>";
TransportConfigCallback transportConfigCallback = new SshTransportConfigCallback();
File gitFolder = new File(workingDirectory);
if (gitFolder.exists()) FileUtils.delete(gitFolder, FileUtils.RECURSIVE);

Git git = Git.cloneRepository()
.setURI(remoteURL)
.setTransportConfigCallback(transportConfigCallback)
.setDirectory(new File(workingDirectory))
.call();
}


private static class SshTransportConfigCallback implements TransportConfigCallback {
private final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
@Override
protected void configure(OpenSshConfig.Host hc, Session session) {
session.setConfig("StrictHostKeyChecking", "no");
}

@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch jSch = super.createDefaultJSch(fs);
jSch.addIdentity("<key_path>/private_key.pem");

return jSch;
}
};

网上搜索后,我将createDefaultJSch更改为使用pemWriter:

@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
JSch jSch = super.createDefaultJSch(fs);
byte[] privateKeyPEM = null;

try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");

List<String> lines = Files.readAllLines(Paths.get("<my_key>.pem"), StandardCharsets.US_ASCII);
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(String.join("", lines)));
RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privSpec);

PKCS8Generator pkcs8 = new PKCS8Generator(privKey);

StringWriter writer = new StringWriter();
PemWriter pemWriter = new PemWriter(writer);
pemWriter.writeObject(pkcs8);

privateKeyPEM = writer.toString().getBytes("US-ASCII");

} catch (Exception e) {
e.printStackTrace();
}

jSch.addIdentity("git", privateKeyPEM, null, null);

return jSch;
}

但仍然遇到“无效私钥”异常。

最佳答案

最新版本的 OpenSSH(7.8 及更高版本)默认生成 OpenSSH 格式的 key ,其开头为:

-----BEGIN OPENSSH PRIVATE KEY-----

JSch 不支持此 key 格式。

<小时/>

您可以使用 ssh-keygen 将 key 转换为经典 OpenSSH 格式:

ssh-keygen -p -f <privateKeyFile> -m pem -P passphrase -N passphrase

这“滥用”-p (更改密码)命令。它将覆盖 -f 标识的私钥文件。选项,带有经典 OpenSSH 格式的新私钥 ( pem )。您可以将当前密码保留为新密码。如果 key 未使用密码加密,请使用 ""而不是passphrase 。之后,您可以使用 ssh-keygen -y -e -f <privateKeyFile> >temp.pub比较公钥并验证现有公钥与新格式的私钥是否有效。

对于 Windows 用户:请注意 ssh-keygen.exe现已内置于 Windows 10/11 中。并且可以是downloaded from Microsoft Win32-OpenSSH project适用于旧版本的 Windows。

<小时/>

在 Windows 上,您还可以使用 PuTTYgen(来自 PuTTY package):

  • 启动 PuTTYgen
  • 加载 key
  • 转至转换 > 导出 OpenSSH key
    对于 RSA key ,它将使用经典格式。
<小时/>

如果您使用 ssh-keygen 创建新 key ,只需添加 -m PEM 经典格式生成新 key :

ssh-keygen -m PEM
<小时/>

实际上,原来的 JSch 似乎不再被积极维护了。特别是,如果您正在开始新项目,它可能不是最好的开始。如今,JSch 遇到了许多兼容性问题。对于一些重要的,请参阅:

相反,您可以考虑使用这个 JSch 分支:
https://github.com/mwiede/jsch

除此之外,它确实支持新的 OpenSSH key 格式。

关于java - 使用 JSch 时为 "Invalid privatekey",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58470542/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com