【问题标题】:Convert PEM traditional private key to PKCS8 private key将 PEM 传统私钥转换为 PKCS8 私钥
【发布时间】:2012-01-07 14:13:46
【问题描述】:

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

-----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

在这一点上非常感谢任何帮助。

【问题讨论】:

  • 我删除了 java 标签,因为它完全不限于 java,希望它能获得更广泛的受众
  • 我认为大多数 OpenSSL 命令都希望每个文件有一个对象(有些人放弃)。创建第二个文件,并且只添加私钥(包括-----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY-----)。然后试试你的命令。
  • 这个问题似乎属于 Stack Exchange 网络中的另一个站点,因为它与编程无关。也许Super User.

标签: openssl certificate


【解决方案1】:

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

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

【讨论】:

  • 这给了我:解密密钥 140139164128912 时出错:错误:0906D06C:PEM 例程:PEM_read_bio:no start line:pem_lib.c:701:Expecting: PRIVATE KEY
  • 私钥前后都用同一个公钥对吧?
  • 只是一个亮点 - 使用 nocrypt 不是最佳实践,应尽可能避免! Doco 在这里 - openssl.org/docs/man1.0.2/man1/openssl-pkcs8.html
  • 这是否意味着输出一个无法在文本编辑器中读取的文件?
【解决方案2】:

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

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

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

【讨论】:

  • 所以这只是 Nilesh 答案的重复?
  • @FranklinYu 这里有区别;输出文件的格式。不过,如果 Sergiu 能解释为什么这与现有答案更好/不同,那就太好了。
  • Peter 询问 DER 密钥作为输出。
  • -outform 应该是DER
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2013-07-17
  • 2011-02-26
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多