【问题标题】:PrivateKeyGenerated by OpenSSL to RSACRTPrivateKey objectPrivateKey 由 OpenSSL 生成到 RSACRTPrivateKey 对象
【发布时间】:2015-02-13 08:30:48
【问题描述】:
有一个PEM格式的privateKey文件,通过Openssl命令生成.csr。
openssl req -newkey rsa:2048 -nodes -out %~dp0\req.csr -keyout %~dp0\..\private.key -sha256 -config %~dp0\..\cfg.cfg
现在,我想从那个文件中得到一个中国剩余定理 - 关键对象。
但我现在不成功。
所以也许你可以帮我一把。
【问题讨论】:
标签:
java
openssl
rsa
bouncycastle
chinese-remainder-theorem
【解决方案1】:
我不确定您是否需要仅支持 BC(LWAPI?)的解决方案,或者您是否会选择可以使用 Sun 或 BC 提供商的 JCE。如果是后者:
由 openssl 生成和编写的 RSA 密钥对始终采用 CRT 形式,除非您努力阻止它,而 req 不会。对于openssl 1.0.0+,来自req -newkey(和大多数其他东西)的私钥文件是PKCS#8 包含 PKCS#1 CRT;在旧版本中,它是“旧版”PKCS#1 CRT,必须重新格式化为 PKCS#8,最容易通过 (edit) openssl pkcs8 -topk8 -nocrypt -in *file* -out *file* [-outform der] (见下文)。 PKCS#8 可以而且经常是加密的,但 req -newkey -nodes 是未加密的,pkcs8 -nocrypt 也是如此。
JCE 可以读取 (edit) 未加密的 DER PKCS#8,其中包含 PKCS#1 CRT(以及其他内容)。使用 openssl 将 PEM 转换为 DER 更容易,因为它是一个简单的命令行(特别是如果结合 legacy 到 PKCS#8 的转换,请参见上文);然后在 Java 中:
- 将 (edit) 未加密的 PKCS#8 DER 读入
byte[] 假设 buffer 和
- 将其传递给
java.security.KeyFactory.getInstance("RSA"[,provider]) .generatePrivate(buffer)(或等效项)。
结果具有依赖于提供者的类型,但无论哪种情况,它都实现了接口java.security.interfaces.RSAPrivateCrtKey。
JCE 本身不做 PEM。如果您有 PEM,请阅读它,去除 BEGIN/END 行,将剩余的 base64 转换为字节,然后继续使用 JCE。