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

从SSLeay格式的密钥构造Java PrivateKey对象,java,openssl,private-key,Java,Openssl,Private Key,我正在开发一个Java(JSE 7)应用程序,该应用程序从外部服务器接收SSLeay格式的私钥,并需要构造一个Java.security.PrivateKey派生对象。由于密钥是动态接收的,并且应用程序禁止使用JNI,因此我无法使用openssl转换密钥 相反,我正在寻找一个纯Java解决方案,用于将SSLeay转换为PKCS#8或其他格式,从而构建私钥 Google展示了两个处理SSLeay密钥的第三方库(例如,一个来自“委托”),但不幸的是,在这个实现中,我被限制不使用外部库。是的,我知道。

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

相反,我正在寻找一个纯Java解决方案,用于将SSLeay转换为PKCS#8或其他格式,从而构建私钥

Google展示了两个处理SSLeay密钥的第三方库(例如,一个来自“委托”),但不幸的是,在这个实现中,我被限制不使用外部库。是的,我知道。甚至连公地也没有

有人知道JSE7标准库中有什么工具可以帮助实现这一点吗?我不介意自己费力地编写转换,但我很难找到SSLeay的精确规范


谢谢你的指点

请注意,这个答案只有在像我一样,为了避免使用任何第三方库而受到限制时才有用。如果允许您使用BouncyCastle或其他库,那么这可能是一种更好的方法

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

  • 编写了一个简单的DER解析器,它只处理DER标记类型2(整数)。解析器必须处理读取DER序列标记(0x30)和固定长度和可变长度的对象
  • 使用
    String.replace
    删除PEM字符串中的RSA密钥页眉和页脚
  • 使用
    DatatypeConverter.parseBase64Binary()
    从PEM字符串获取字节数组
  • 使用DER解析器从数据中提取
    BigInteger
    s:版本、模、公共指数、私有指数、素数P、素数Q、素数指数P、素数指数Q和CRT系数(按该顺序)
  • 根据这些值创建了一个
    java.security.spec.rsaprovatecrtkeyspec
    对象(
    keySpec
  • PrivateKey=KeyFactory.getInstance(“RSA”).generatePrivate(keySpec)
  • 这对我来说是可行的,但不幸的是,这是对几个轮子的一次重新发明