我得到了一个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
尝试使用以下命令。我还没试过,但我想应该有用。
openssl pkcs8 -topk8 -inform 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密钥,就可以工作。
我知道这是一篇旧文章,但我有相同的要求(即从pkcs# 1转换到pkcs# 8),我先登陆这里。
经过一番研究,我在这里找到了答案,我认为这值得分享。
在这篇文章中,tytk也引用了这个关于pkcs# 1和pkcs# 8的非常好的描述。
话虽如此,总结一下:
- 当使用
openssl genrsa
时,生成的私钥将默认为pkcs# 1格式。 - 要转换为pkcs# 8,可以简单地运行命令
openssl pkey
,如下所示:openssl pkey -in IServer_Key.orig.prikey.pem -out IServer_Key.pkcs8.pem
创建新的证书:
openssl req -newkey rsa:2048 -x509 -keyout key.pem -out cert.pem -sha256 -days 365
生成已解码的证书:
openssl pkcs8 -in key.pem -out key_unencrypted.pem