从SSLeay格式化密钥构造Java PrivateKey对象

时间:2013-05-08 17:36:27

标签: java openssl private-key

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

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

谷歌搜索显示了几个处理SSLeay密钥的第三方库(例如,一个来自“Entrust”),但遗憾的是,在此实现中不能使用任何外部库。是的我知道。甚至不是Commons。

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

感谢您的任何指示!

1 个答案:

答案 0 :(得分:0)

请注意,此答案仅在我受限制时才有用,以避免使用任何第三方库。如果您被允许使用BouncyCastle或其他库,那么这可能是更好的方法。

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

  1. 写了一个只处理DER标签类型2(整数)的简单DER解析器。解析器必须处理读取DER序列标记(0x30)以及固定和可变长度的对象。
  2. 使用String.replace删除PEM字符串中的RSA密钥页眉和页脚。
  3. 使用DatatypeConverter.parseBase64Binary()从PEM字符串中获取字节数组。
  4. 使用DER解析器从数据中提取BigInteger:版本,模数,公共指数,私有指数,素数P,素数Q,素数指数P,素数指数Q和CRT系数(按此顺序) )。
  5. 根据这些值创建了java.security.spec.RSAPrivateCrtKeySpec对象(keySpec)。
  6. PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);
  7. 这对我的目的起作用,但是对于几个轮子来说是一个不幸的重新发明。