我正在研究使用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
谢谢, 荻帆
答案 0 :(得分:0)
查看PEM文件,您会看到一个以-----BEGIN PRIVATE KEY-----
开头,另一个以-----BEGIN RSA PRIVATE KEY-----
开头。 PEM块的BEGIN和END行中的字指定块中数据的格式,这些字符指定OpenSSL支持的大约10个(具体取决于您的计算方式)不同数据格式中的两个RSA密钥。
第一部分是第5部分的未加密的PKCS8 republished as RFC 5208变种.PKCS8可以处理许多不同算法的私钥,包括RSA DSA DH和ECDSA,有或没有密码 - 基于密钥的加密(PBE)。 openssl genpkey
旨在处理多种算法,并使用PKCS8格式来执行此操作。
第二个是A.1节中仅PKA1 republished as RFC3447 et pred的RSA 私钥语法。此格式由较早的openssl rsa
和openssl genrsa
函数编写,因为它们只处理RSA,并且称为“传统”和#39;或者'遗产'格式以区别于PKCS8。 PKCS1没有定义任何加密格式,但OpenSSL支持通用的PEM加密方案,如果您没有请求,可以应用于此格式。但是,OpenSSL'遗产' PEM加密不如PKCS8中使用的那么好,因此如果需要安全性,通常应该使用PKCS8,或者对于带有证书的私钥,可能使用PKCS12。
您可以使用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
由于PEG文件(与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文件,如果提供了正确的密码,也可以自动读取两种加密格式中的任何一种。