如何在 Java 中使用 OPENSSH PRIVATE KEY?

Ily*_*man 5 java pem dsa ssh-keygen

我使用以下命令生成 DSA 密钥:

ssh-keygen -t dsa
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用 bouncycastle API 来签署数据,如下所示:

    KeyFactory keyFactory = KeyFactory.getInstance("DSA");
    String privateKeyContent = // the content of the generated file

    //init privateKey
    byte[] pemContent = null;
    PEMParser pemParser = new PEMParser(new StringReader(privateKeyContent));
    Object pemObject = pemParser.readObject(); // throws
Run Code Online (Sandbox Code Playgroud)

并得到这个异常

java.io.IOException:无法识别的对象:OPENSSH 私钥

所以我一直在尝试使用此示例将密钥文件转换为 PEM ,并执行:

ssh-keygen -e -f key -m PEM > key.pem
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

do_convert_to_pem: unsupported key type DSA
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题有什么想法吗?

Lee*_*ter 6

这里发生了一些事情。

  1. 您正在使用最新版本的 OpenSSH 生成密钥(这很好)。这些现在以 OpenSSH 的新密钥格式输出,BouncyCastle API 无法将其识别为自定义格式。

  2. 您正在生成 DSA 密钥。OpenSSH 不推荐使用 DSA,因为它不像 RSA、ECDSA、ED25519 等提供的其他私钥类型那样安全。它不允许你转换它。

我建议您将密钥类型更改为 2048 位(最小值)的 RSA 密钥。但是,这不会阻止 BouncyCastle API 错误,因为它仍然采用新的 OpenSSH 格式。

这实际上取决于您用钥匙做什么。如果您不在 SSH API 中使用它来对远程服务器进行身份验证,而只是想使用 BouncyCastle API 签署数据,那么您最好使用 OpenSSL 和命令生成密钥

openssl genrsa -out private.pem 2048
Run Code Online (Sandbox Code Playgroud)

然后 BouncyCastle API 应该能够识别该密钥。