【问题标题】:How to read an OpenSSH or OpenSSL private key natively in Java?如何在 Java 中本地读取 OpenSSH 或 OpenSSL 私钥?
【发布时间】:2018-07-25 08:23:19
【问题描述】:

我想在不使用 BouncyCastle 的情况下以 Java 原生方式读取 OpenSSL 私钥。

我已经为此进行了广泛的搜索,但找不到答案。当您看到如下键时:

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

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

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

编辑: 建议的副本都没有谈论使用纯 java 解决方案(没有 openssl)和没有 Bouncy Castle。除非有人问过这个确切的问题,否则请不要将其标记为重复。

西方开发商很容易对亚洲国家的商业运作方式一无所知。例如,中国有一整套在 OpenSSL 和 Bouncycastle 中闻所未闻的 EC 曲线,用于跨企业商务,因此这两个工具:OpenSSL 和 Bouncycastle 要么是非常旧的版本,要么在全部。像“只使用 openssl”这样的答案既无帮助也无建设性。

【问题讨论】:

  • 如果你不愿意使用 Bouncycastle,你真的想使用openssl -topk8
  • 我知道 openssl 可以进行转换,如上所述,但 openssl 不随 JDK 一起分发,因此不可能。

标签: java cryptography openssh pkcs#8


【解决方案1】:

https://www.rfc-editor.org/rfc/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
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 2019-10-21
      • 2013-07-13
      • 1970-01-01
      • 2014-05-16
      • 2017-05-04
      • 1970-01-01
      • 2015-11-25
      • 2012-09-10
      相关资源
      最近更新 更多