首页 > 解决方案 > 如何在 Java 中将 OpenSSH 私钥转换为 RSA 私钥?

问题描述

我有一个 OpenSSH 格式的私钥文件:

-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

但我需要 RSA 格式:

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

在终端上我会这样做:

ssh-keygen -p -m PEM -f my-openssh-file

但我需要用Java来做。

我尝试过使用 org.bouncycastle.openssl.PEMWriter,但我不知道如何将输入密钥(作为输入字符串)转换为可以传递给 PEMWriter 的 PrivateKey 对象。

标签: javarsajschssh-keys

解决方案


这实际上可以通过Maverick Synergy Java SSH API实现。

我们的 SSH API 的这个新分支支持新的 OpenSSH 私钥文件格式,因此您可以加载新密钥并将其转换为 BouncyCastle 支持的旧 PEM 格式。

您将需要以下 Maven 依赖项:

    <dependency>
        <groupId>com.sshtools</groupId>
        <artifactId>maverick-synergy-client</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>com.sshtools</groupId>
        <artifactId>maverick-bc</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>

您还需要以下快照存储库,因为目前还没有正式发布 API:

    <repository>
        <id>oss-snapshots</id>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </repository>

首先,您可以使用以下方法加载新的 OpenSSH 私钥格式:

SshKeyPair key = SshKeyUtils.getPrivateKey(
          new File("id_rsa"), "passphrase");

然后,您可以通过将其传递到较旧的格式实现并通过 getFormattedKey 方法检索文本来对其进行转换。

System.out.write(new OpenSSHPrivateKeyFileBC(
          key, "passphrase").getFormattedKey());

作为此答案的一些背景知识并声明我是推荐项目的开发人员,Maverick Synergy 是第三代 API,它继承了 J2SSH Maverick 和 Maverick Legacy 商业 API。Maverick Synergy 完全可以作为 LGPL 许可的开源产品使用。


推荐阅读