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

Posted

技术标签:

【中文标题】如何在 Java 中将 OpenSSH 私钥转换为 RSA 私钥?【英文标题】:How to convert OpenSSH private key to RSA private key in Java? 【发布时间】:2019-11-15 22:39:04 【问题描述】:

我有一个 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 之外的其他任何东西都不支持。 @JamesKPolk 是的,不幸的是,这正是我想将其转换为 RSA 的原因。当您使用 ssh-keygen 时,最新版本的 OSX Mojave 默认会生成 openssh 密钥文件,因此我们看到不少用户无意中使用了这些密钥文件。想要为他们自动转换。 【参考方案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:

    <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 许可。

【讨论】:

是否可以将任何私钥转换为 RSA 格式? 两种格式之间只能转换RSA私钥 随着新版本 3.0.0-RC1 的类 com.sshtools.common.publickey.OpenSSHPrivateKeyFileBC 移动到 com.sshtools.common.publickey.bc.OpenSSHPrivateKeyFileBC

以上是关于如何在 Java 中将 OpenSSH 私钥转换为 RSA 私钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何把OpenSSH公钥转换成OpenSSL格式

如何将密码添加到在没有密码的情况下生成的 OpenSSH 私钥?

sh 不同的私钥/公钥转换GnuPG,OpenSSH和OpenSSL

OpenSSH生成的私钥如何在putty中使用?

使用 Openssh 私钥登录

如何在SecureCRT上使用公钥登陆Linux服务器