如何在Java中将OpenSSH私钥转换为RSA私钥?

时间:2019-07-05 09:48:38

标签: java rsa jsch ssh-keys

我有一个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对象。

1 个答案:

答案 0 :(得分:2)

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许可下的开源产品完全可用。