Openssl RSA 密钥 PEM 和 DER 转换 - 不匹配
Openssl RSA key PEM and DER conversion - does not match
我正在研究带有 RSA 密钥生成和操作的 openssl。首先,我生成了一个以 PEM 格式编码但未加密的密钥对:
openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048
然后我转成DER格式:
openssl rsa -inform PEM -outform DER -in key.pem -out key1.cer
然后我将它转换回 PEM 编码:
openssl rsa -inform DER -outform PEM -in key1.cer -out key2.pem
现在如果我比较两者,它们的内容不同(BASE64 编码文本)。文件的大小也不同...
diff key.pem key2.pem
这是为什么?我是不是做错了什么?
所有的钥匙都附在这里。
https://www.dropbox.com/sh/ec1sm3y63sahwks/AAB6At3x_j5LRyf63gJDJn39a?dl=0
谢谢,
地番
查看 PEM 文件,您会看到一个以 -----BEGIN PRIVATE KEY-----
开头,另一个以 -----BEGIN RSA PRIVATE KEY-----
开头。 PEM 块的 BEGIN 和 END 行中的单词指定了块中数据的格式,这些指定了大约 10 种中的两种(具体取决于您的计数方式)支持不同的数据格式通过 OpenSSL 获取 RSA 密钥。
第一个是第 5 节的 PKCS8republished as RFC 5208 的未加密变体。PKCS8 可以处理许多不同算法的私钥,包括 RSA DSA DH 和 ECDSA,使用或不使用密钥的基于密码的加密 (PBE)。 openssl genpkey
旨在处理多种算法并使用 PKCS8 格式来实现。
第二个是 PKCS1republished as RFC3447 的 RSA-only 私钥语法,已在 A.1 节中介绍。此格式由较旧的 openssl rsa
和 openssl genrsa
函数编写,因为它们仅处理 RSA,并称为 'tradtional' 或 'legacy' 格式以区别于 PKCS8。 PKCS1 没有定义任何加密格式,但 OpenSSL 支持通用的 PEM 加密方案,如果您没有请求,可以将其应用于此格式。但是,OpenSSL 'legacy' PEM 加密不如 PKCS8 中使用的那样好,因此如果您想要安全性,通常应该使用 PKCS8,或者可能 PKCS12 代替私钥 with certificates.
您可以使用 pkey
转换为 PKCS8 DER 并返回 PEM,就像 genpkey
处理多种算法并使用 PKCS8:
openssl pkey -in key.pem [-inform PEM] -out key.der -outform DER
openssl pkey -in key.der -inform DER -out xxx.pem [-outform PEM]
# now xxx.pem is the same as key.pem
由于 PEM 文件(与 DER 不同)可以通过 BEGIN 行中的类型识别,您可以将 PKCS1 PEM 直接转换回 PKCS8:
openssl pkey -in key2.pem -out yyy.pem
# now yyy.pem is the same as key.pem
使用 OpenSSL 库的程序,包括但不限于 openssl
命令行,可以自动读取这些格式之一的私钥 PEM 文件,如果密码正确,也可以自动读取两种加密格式之一提供。
我正在研究带有 RSA 密钥生成和操作的 openssl。首先,我生成了一个以 PEM 格式编码但未加密的密钥对:
openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048
然后我转成DER格式:
openssl rsa -inform PEM -outform DER -in key.pem -out key1.cer
然后我将它转换回 PEM 编码:
openssl rsa -inform DER -outform PEM -in key1.cer -out key2.pem
现在如果我比较两者,它们的内容不同(BASE64 编码文本)。文件的大小也不同...
diff key.pem key2.pem
这是为什么?我是不是做错了什么?
所有的钥匙都附在这里。 https://www.dropbox.com/sh/ec1sm3y63sahwks/AAB6At3x_j5LRyf63gJDJn39a?dl=0
谢谢, 地番
查看 PEM 文件,您会看到一个以 -----BEGIN PRIVATE KEY-----
开头,另一个以 -----BEGIN RSA PRIVATE KEY-----
开头。 PEM 块的 BEGIN 和 END 行中的单词指定了块中数据的格式,这些指定了大约 10 种中的两种(具体取决于您的计数方式)支持不同的数据格式通过 OpenSSL 获取 RSA 密钥。
第一个是第 5 节的 PKCS8republished as RFC 5208 的未加密变体。PKCS8 可以处理许多不同算法的私钥,包括 RSA DSA DH 和 ECDSA,使用或不使用密钥的基于密码的加密 (PBE)。 openssl genpkey
旨在处理多种算法并使用 PKCS8 格式来实现。
第二个是 PKCS1republished as RFC3447 的 RSA-only 私钥语法,已在 A.1 节中介绍。此格式由较旧的 openssl rsa
和 openssl genrsa
函数编写,因为它们仅处理 RSA,并称为 'tradtional' 或 'legacy' 格式以区别于 PKCS8。 PKCS1 没有定义任何加密格式,但 OpenSSL 支持通用的 PEM 加密方案,如果您没有请求,可以将其应用于此格式。但是,OpenSSL 'legacy' PEM 加密不如 PKCS8 中使用的那样好,因此如果您想要安全性,通常应该使用 PKCS8,或者可能 PKCS12 代替私钥 with certificates.
您可以使用 pkey
转换为 PKCS8 DER 并返回 PEM,就像 genpkey
处理多种算法并使用 PKCS8:
openssl pkey -in key.pem [-inform PEM] -out key.der -outform DER
openssl pkey -in key.der -inform DER -out xxx.pem [-outform PEM]
# now xxx.pem is the same as key.pem
由于 PEM 文件(与 DER 不同)可以通过 BEGIN 行中的类型识别,您可以将 PKCS1 PEM 直接转换回 PKCS8:
openssl pkey -in key2.pem -out yyy.pem
# now yyy.pem is the same as key.pem
使用 OpenSSL 库的程序,包括但不限于 openssl
命令行,可以自动读取这些格式之一的私钥 PEM 文件,如果密码正确,也可以自动读取两种加密格式之一提供。