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

73

我已经获得了一个包含证书和公/私钥的PEM文件。具体而言,它包括如下标题

-----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。我尝试过OpenSSL(使用rsa和pkcs8命令),但没有成功。如果有更简单的方法,则不必使用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

我也尝试过指定 inform 和 outform 但没有成功。

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
任何帮助都将不胜感激。

2
我删除了Java标签,因为它并不仅限于Java,希望能够得到更广泛的受众。 - cfi
我认为大多数OpenSSL命令都期望每个文件只有一个对象(有些是抽象的)。创建第二个文件,仅向其中添加私钥(包括 -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----)。然后再尝试你的命令。 - jww
OpenSSL pkcs8 默认格式提供 RSA 私钥。 - jww
1
这个问题似乎不属于编程范畴,应该在 Stack Exchange 网络的其他站点上发布。也许可以考虑 Super User - jww
4个回答

114

尝试使用以下命令。我没有试过,但我认为它应该有效。

openssl pkcs8 -topk8 -inform PEM -outform DER -in filename -out filename -nocrypt

15
这让我遇到了问题:解密密钥出错 140139164128912:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: PRIVATE KEY - Konrad Garus
私钥在使用前后都使用相同的公钥,对吗? - Panup Pong
1
仅供参考 - 使用nocrypt不是最佳实践,应尽可能避免!文档在此处 - https://www.openssl.org/docs/man1.0.2/man1/openssl-pkcs8.html - buch11
这是要输出一个无法在文本编辑器中读取的文件吗? - theonlygusti

88

使用openssl将私钥从PKCS#1转换为PKCS#8:

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

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


10
那么这只是尼勒什答案的复制品吗? - Franklin Yu
7
这里有一个区别,就是输出文件的格式。如果Sergiu能够解释一下为什么这种方法比现有答案更好/不同的话,那就太好了。 - Rob
3
彼得询问 DER 密钥作为输出的问题。 - Der_Meister
2
-outform should be DER - Zimba
1
我来到这个问题是为了寻找将PEM证书导入Azure Vault的解决方案。这很有帮助。 - gitrust
显示剩余2条评论

0
我知道这是一篇旧文章,但我有同样的需求(即从PKCS#1转换为PKCS#8),所以我首先来到了这里。
经过一些研究,我找到了答案在这里,我觉得值得分享。 在这篇帖子中,tytk还提到了这个PKCS#1与PKCS#8的非常好的描述
话虽如此,总结一下:
1. 使用openssl genrsa生成的私钥默认为PKCS#1格式。 2. 要转换为PKCS#8,只需运行以下命令:
openssl pkey -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem

-3
创建一个新证书:
openssl req -newkey rsa:2048 -x509 -keyout key.pem -out cert.pem -sha256 -days 365

生成解码证书:

openssl pkcs8 -in key.pem -out key_unencrypted.pem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接