java - 如何在 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 对象。
解决方案
这实际上可以通过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 许可的开源产品使用。
推荐阅读
- c# - 类型错误:无法在“窗口”上执行“获取”:使用 GET/HEAD 方法的请求不能有正文 - 在带有 swagger UI 的 asp.net 核心中
- c# - 设置背景图像时,MDI 子窗体边框被绘制在 MDI 父窗体上
- mysql - 如何避免在 PHPMyAdmin UI 中显示十六进制值的数据
- properties - 投注方式为客户提供更改默认值的选项?
- python - 我有一个用字符串写的列表,我如何将它变成 Python 中的真实列表
- c++ - 为什么 GCC 错误地检测移位计数溢出?
- java - 在 Java 中呈现动态 Jasper 报告时出现 XmlParser 错误
- vue.js - 仅在特定布局和页面中添加 linkExactActiveClass
- r - R Shiny - 错误:找不到对象'template_dfa'
- intellij-idea - 点问题后 Intellij 重新格式化和重新排列空白行