Openssl 将PEM传统私钥转换为PKCS8私钥

Openssl 将PEM传统私钥转换为PKCS8私钥,openssl,certificate,Openssl,Certificate,我得到了一个PEM文件,其中包含证书和pub/私钥。具体来说,它包括标题 -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- -----BEGIN RSA PUBLIC KEY----- -----END RSA PUBLIC KEY----- 按照特定的顺序 我的理解是,在BEGIN

我得到了一个PEM文件,其中包含证书和pub/私钥。具体来说,它包括标题

-----BEGIN CERTIFICATE-----   
-----END CERTIFICATE-----   
-----BEGIN RSA PRIVATE KEY-----   
-----END RSA PRIVATE KEY-----   
-----BEGIN RSA PUBLIC KEY-----   
-----END RSA PUBLIC KEY-----
按照特定的顺序

我的理解是,在
BEGIN RSA PRIVATE KEY
头之后没有头,即此pem文件包含一个传统格式(PKCS1)的私钥,没有加密

我需要将此私钥转换为DER编码的PKCS8未加密格式,以用于java服务器代码,特别是PKCS8EncodedKeySpec。我用rsa和pkcs8命令尝试了OpenSSL,但没有成功。如果有更简单的方法,就不需要使用openssl

具体而言:

openssl rsa -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem
openssl rsa -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem -pubin openssl pkcs8 -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem -nocrypt
我也尝试过指定通知和输出,但没有成功

user@ubuntu:~/TestCerts$ openssl rsa -in IServer_Key.pem -out IServer_Key.pkcs8.pem -pubin 
unable to load Public Key 
5925:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:
Expecting: PUBLIC KEY

user@ubuntu:~/TestCerts$ openssl rsa -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem 
unable to load Private Key 
5993:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316: 
5993:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:828:
5993:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:748:Field=n, Type=RSA 
5993:error:0D09A00D:asn1 encoding routines:d2i_PrivateKey:ASN1 lib:d2i_pr.c:99: 
5993:error:0907B00D:PEM routines:PEM_READ_BIO_PRIVATEKEY:ASN1 lib:pem_pkey.c:125:

user@ubuntu:~/TestCerts$ openssl pkcs8 -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem -nocrypt 
Error decrypting key 
6022:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:
Expecting: PRIVATE KEY

如果您有任何帮助,我们将不胜感激。

请尝试使用以下命令。我还没试过,但我觉得应该行得通

opensslpkcs8-topk8-notify PEM-outform DER-in filename-out filename-nocrypt

要使用openssl将私钥从PKCS#1转换为PKCS#8,请执行以下操作:

# openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in pkcs1.key -out pkcs8.key

只要您拥有问题中所述的PEM(文本格式)PKCS#1密钥,这将起作用。

我删除了java标记,因为它完全不局限于java,希望它能获得更广泛的听众。我认为大多数OpenSSL命令都希望每个文件都有一个对象(有些是免提的)。创建第二个文件,只向其中添加私钥(包括
----BEGIN-RSA私钥------
----END-RSA私钥------
)。然后尝试您的命令。这个问题似乎属于Stack Exchange网络中的另一个站点,因为它与编程无关。也许。这给了我:解密密钥140139164128912时出错:错误:0906D06C:PEM例程:PEM_read_bio:无起始行:PEM_lib.c:701:期望:私钥在使用相同的公钥之前和之后都使用私钥对吗?只是一个亮点-使用nocrypt不是最佳实践,应该尽可能避免!Doco here-这意味着输出一个在文本编辑器中无法读取的文件吗?所以这只是Nilesh答案的副本吗?@FranklinYu这里有一个区别;输出文件的格式。不过,如果Sergiu能够解释为什么这比现有答案更好/不同,那就太好了。Peter询问了作为输出的DER键。
-outform
应该是
DER