当前位置: 首页 > 知识库问答 >
问题:

如何在Java中将RSA公钥-私钥对转换为openssh格式?

巫马昆杰
2023-03-14

我需要用java生成openssh格式的密钥对。

我使用java中的KeyPairGenerator生成了一个公私密钥对,并将其保存到一个文件中:

    gen.initialize(2048);
    KeyPair pair = gen.generateKeyPair();
    Base64.Encoder encoder = Base64.getEncoder();
    
    PrivateKey privateKey = pair.getPrivate();
    PublicKey publicKey = pair.getPublic();
    System.out.println(encoder.encodeToString(publicKey.getEncoded());
    System.out.println(encoder.encodeToString(privateKey.getEncoded()); 

但是,如果我尝试使用这个与ssh-keygen我得到一个"失败加载密钥private.key:无效格式"

如何将PKCS#8私钥转换为openssh格式或生成openssh格式的密钥对?

共有1个答案

充阳秋
2023-03-14

对于私钥,PKCS8 PEM与OpenSSH兼容。(与Maarten相反,您不能使用DER,但与Topaco相反,您不需要转换为PKCS1“传统”格式。)您确实需要创建正确的PEM,这需要正文中的页眉和页脚行以及换行符(不是一个巨大的字符串);请参见维基百科或rfc7468。Java8Base64.getMimeEncoder()执行换行符。

PrivateKey pkey = pair.getPrivate();
System.out.println ("-----BEGIN PRIVATE KEY-----");
System.out.println (Base64.getMimeEncoder().encodeToString(pkey.getEncoded()));
// to be strict use getMimeEncoder(64, value_of_line_separator)
// for PEM, but in practice MIME default 76 actually works
System.out.println ("-----END PRIVATE KEY-----");

注意:这种格式是未加密的,因此任何获取/查看您的文件(或其副本或备份)的人都会获取您的私钥。这是否、何时以及如何成为一个问题取决于许多因素,并取决于安全性。SX不是这样。OpenSSH支持并通常鼓励加密的私钥文件,但(也)支持未加密的私钥文件。

公开密钥更难。OpenSSH的公钥格式不遵循Java支持的标准(没有添加BouncyCastle)。然而,你可以手工构建,这已经被回答了好几次;请参阅我在ssh-keygen上的列表,openssl提供了两种不同的公钥,以及如何在Java中从ssh-RSA公钥计算指纹的示例?(其中引用了相同的内容)。请注意,OpenSSL首选的X.509 SubjectPublicKeyInfo格式与Java的PublicKey使用的格式相同。getEncoded()(Java的.getFormat()含糊不清地调用“X.509”),除了Java只使用binary/DER,而OpenSSL同时使用binary/DER和PEM。

 类似资料:
  • 我有一个OpenSSH格式的私钥文件: 但我需要RSA格式: 在终端我会这样做: 但我需要用Java来做。 我尝试使用org.bouncycastle.openssl.PEMWriter,但我无法解决如何将我的输入键(作为输入字符串)转换为可传递给PEMWriter的Private ateKey对象。

  • 我有以下公钥(作为示例): 我需要能够将其转换为可以插入ssh known_hosts文件的格式。例如: 谢了!

  • 让我先解释一下我的问题。我从CA购买了一个证书,并使用以下格式生成csr和私钥: 有趣的是,在aws文档页面上,他们显示的示例私钥以“------开始RSA私钥-------”开头 有没有办法使用OpenSSL将我的私钥转换为RSA私钥?

  • 问题内容: 我有以下格式的公钥 我需要将其转换为以下格式 基本上,问题是我正在使用用Java编写的第三方库。 第三方库使用Java类“ RSAPublicKeySpec”从字符串生成RSAPublicKey类型的实例。 我提供给该第三方库的字符串取自以下格式的文件: 仔细研究一下代码之后,我可以看到,如果我使用java类“ X509EncodedKeySpec”来加载此公共密钥,则代码的签名验证部

  • 问题内容: 有没有办法以编程方式将Jsch生成的SSH RSA密钥转换为javax.crypto.Cipher可以用于加密的格式?我几乎看到了与此类似的答案: 但是我没有访问openSSL或shell命令的权限。顺便说一句:我只使用JDK6。 由于@erickson对他的帮助,我可以从转换RFC4716的公共密钥使用的指数和模量作为Java公共密钥传递给类型同。他的解决方案如下。 现在,我正在尝试

  • null BouncyCastle/Java ASN1-DER和PEM中的密钥结构 RFC3447 RFC4716 RSA_KEY_BREAKER