繁体   English   中英

如何以Java本机读取OpenSSH或OpenSSL私钥?

[英]How to read an OpenSSH or OpenSSL private key natively in Java?

我想在不使用BouncyCastle的情况下以Java本机读取OpenSSL私钥。

我已经对此进行了广泛的搜索,但是找不到答案。 当您看到类似以下的键时:

-----BEGIN EC PRIVATE KEY-----
...base64 here....
-----END EC PRIVATE KEY-----

那是什么格式? 它似乎与OpenSSH密钥具有相同的编码(我认为)。 不是 pkcs8 ,尽管OpenSSL允许您使用带有-topk8参数的pkcs8命令将其密钥格式转换为pkcs8

我当然不是唯一遇到此问题的人,但是尽管进行了广泛的搜索,但我找不到答案。 谢谢!

编辑:建议的重复项都没有谈论使用纯Java解决方案(没有openssl)和没有充气城堡。 除非提出了确切的问题,否则请不要将其标记为重复项。

西方开发商很容易不知道在亚洲国家开展业务的方式。 例如,中国拥有完整的EC曲线集,这些曲线在OpenSSL和Bouncycastle中是闻所未闻的,用于企业间贸易,因此这两个工具(OpenSSL和Bouncycastle)要么是很旧的版本,要么在以下版本中不可用所有。 诸如“ just use openssl”之类的答案既无用,也无建设性。

https://tools.ietf.org/html/rfc5915

  1. 椭圆曲线私钥格式

    本节提供EC私钥的语法。 计算上,EC私钥是一个无符号整数,但为了表示,EC私钥信息应具有ASN.1类型的ECPrivateKey:

ECPrivateKey ::= SEQUENCE {
 version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
 privateKey     OCTET STRING,
 parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
 publicKey  [1] BIT STRING OPTIONAL
}

起始块和结束块之间的Base64块是ASN.1编码的私钥数据,格式为他的答案中所述的bartonjs。 如果没有图书馆来接管您的工作,则您必须自己进行加载。 例如,可以在此处找到有关如何为RSA执行此操作的示例。 通过将相应的算法名称传递给KeyFactory.getInstance(...);可以类似的方式加载其他格式KeyFactory.getInstance(...); 为此,您必须在begin-block处解析文本,并从那里的名称到用于创建工厂的算法名称进行映射(大多数应与该块中提供的相同) ,但我不确定问题中提供的示例中使用的椭圆曲线)。

需要将base64块解码为字节数组,以将其传递给KeySpec

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM