繁体   English   中英

根据SSLeay格式的密钥构造Java PrivateKey对象

[英]Construct a Java PrivateKey object from an SSLeay formatted key

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

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

Googling显示了几个处理SSLeay密钥的第三方库(例如,一个来自“ Entrust”的密钥),但不幸的是,此实现限制为不使用外部库。 是的我知道。 甚至没有下议院。

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

谢谢您的指点!

请注意,这个答案只有在像我一样受到限制的情况下才有用,以避免使用任何第三方库。 如果被允许使用BouncyCastle或其他库,那大概是一种更好的方法。

我收到的密钥是编码为PEM的OpenSSL(“传统SSLeay”)DER格式的RSA密钥。 我可以通过以下方式获取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);

这出于我的目的而工作,但是不幸地是重新发明了两个轮子。

暂无
暂无

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

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