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

4

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


目前,openssh格式相对较新,并且除了openssh之外,没有太多的支持。 - President James K. Polk
@JamesKPolk 是的,这正是我想将其转换为RSA的原因。最新版本的OSX Mojave在使用ssh-keygen时默认生成openssh密钥文件,因此我们看到很多用户意外地使用了这些密钥文件。希望能自动为他们转换这些文件。 - Tom G
1个回答

1
这实际上可以通过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的正式发布:

(您仍需添加以下快照仓库,因当前尚未有该API的正式发布版本。)

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

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

Original Answer翻译成:最初的回答

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

那么,您可以通过将其传递到旧格式实现并通过getFormattedKey方法检索文本来进行转换。翻译:"然后,您可以通过将其传入较旧的格式实现并通过getFormattedKey方法检索文本来进行转换。"
System.out.write(new OpenSSHPrivateKeyFileBC(
          key, "passphrase").getFormattedKey());

作为此答案的背景说明并声明我是推荐项目Maverick Synergy的开发者,它是第三代API,继承自J2SSH Maverick和Maverick Legacy商业API。Maverick Synergy作为LGPL许可的开源产品完全可用。"最初的回答"

能否将任何私钥转换为RSA格式? - Displee
只有RSA私钥可以在不同格式之间进行转换。 - Lee David Painter
在新版本3.0.0-RC1中,类com.sshtools.common.publickey.OpenSSHPrivateKeyFileBC已经移动到com.sshtools.common.publickey.bc.OpenSSHPrivateKeyFileBC。 - Robert Halter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接