0

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

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

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

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

感谢您的任何指点!

4

1 回答 1

0

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

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

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

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

于 2013-05-15T21:37:32.607 回答