【问题标题】:Construct a Java PrivateKey object from an SSLeay formatted key从 SSLeay 格式的密钥构造 Java PrivateKey 对象
【发布时间】:2013-05-03 01:09:59
【问题描述】:

我正在开发一个 Java (JSE 7) 应用程序,该应用程序从外部服务器接收 SSLeay 格式的私钥,并且需要构造一个 java.security.PrivateKey 派生对象。由于密钥是动态接收的,并且应用被禁止使用JNI,所以我无法使用openssl来转换密钥。

相反,我正在寻找一种纯 Java 解决方案,用于从 SSLeay 转换为 PKCS#8 或其他可以构造 PrivateKey 的格式。

谷歌搜索显示了一些处理 SSLeay 密钥的第三方库(例如,来自“Entrust”的一个),但不幸的是,在此实现中受限于不使用外部库。是的,我知道。甚至没有Commons。

是否有人知道 JSE 7 标准库中的任何工具可以对此有所帮助?我不介意自己编写转换,但很难找到 SSLeay 的精确规范。

感谢您的指点!

【问题讨论】:

    标签: java openssl private-key


    【解决方案1】:

    请注意,此答案仅在像我一样受到限制以避免使用任何 3rd 方库的情况下才有用。如果允许您使用 BouncyCastle 或其他库,那可能是更好的选择。

    我收到的密钥是编码为 PEM 的 OpenSSL(“传统 SSLeay”)DER 格式的 RSA 密钥。我能够通过以下方式获得 Java java.security.PrivateKey 对象:

    1. 编写了一个简单的 DER 解析器,它只处理 DER 标记类型 2(整数)。解析器必须处理读取 DER 序列标签 (0x30) 以及固定和可变长度对象。
    2. 使用 String.replace 去除 PEM 字符串中的 RSA 密钥页眉和页脚。
    3. 使用 DatatypeConverter.parseBase64Binary() 从 PEM 字符串中获取字节数组。
    4. 使用 DER 解析器从数据中提取 BigIntegers:版本、模数、公共指数、私人指数、素数 P、素数 Q、素数指数 P、素数指数 Q 和 CRT 系数(按此顺序)。
    5. 根据这些值创建了一个 java.security.spec.RSAPrivateCrtKeySpec 对象 (keySpec)。
    6. PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

    这符合我的目的,但不幸的是对几个轮子的重新发明。

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2015-07-24
      • 2018-01-20
      • 2019-04-23
      • 1970-01-01
      相关资源
      最近更新 更多