我正在使用以下代码在 Java 应用程序中使用 Git。我有一个有效的密钥(一直使用它),这个特定的代码之前使用相同的密钥和 git 存储库对我有用,但现在我得到以下异常:
私钥无效:[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;
}
但仍然收到 “无效私钥” 异常。
原文由 o_b7 发布,翻译遵循 CC BY-SA 4.0 许可协议
我也偶然发现了这个问题。在 mac 上运行 Jgit ,对于某些用户,我们看到以下异常:
发现根本原因是ssh私钥不匹配。异常仅发生在使用较新类型 ed25519 密钥的用户身上,该密钥输出此密钥标头:
-----BEGIN OPENSSH PRIVATE KEY-----
而不是那种 RSA :
-----BEGIN RSA PRIVATE KEY-----
重新生成 RSA 密钥 (
ssh-keygen -t rsa
),使异常消失。编辑以下评论:如果您有 OpenSSH 7.8 及更高版本,您可能需要将 -m PEM 添加到生成命令中:
ssh-keygen -t rsa -m PEM