30

openssl RSA密钥格式PKCS1和PKCS8相互转换

 3 years ago
source link: https://zdb.im/archives/138.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

openssl 生成pkcs1格式的私钥,密钥长度2048位, (PKCS1)

openssl genrsa -out private.pkcs1.pem 2048

PKCS1私钥转换为PKCS8

openssl pkcs8 -topk8 -inform PEM -in private.pkcs1.pem -outform pem -nocrypt -out private.pkcs8.pem

逆过程:PKCS8格式私钥再转换为PKCS1格式

openssl rsa -in private.pkcs8.pem -out private.pkcs1.pem

从pkcs1私钥中生成pkcs8公钥

openssl rsa -in private.pkcs1.pem -pubout -out public.pkcs8.pem

从pkcs8私钥中生成pkcs8公钥

openssl rsa -in private.pkcs8.pem -pubout -out public.pkcs8.pem

pkcs8公钥转pkcs1公钥

openssl rsa -pubin -in public.pkcs8.pem -RSAPublicKey_out -out public.pkcs1.pem

pkcs1公钥转换为pkcs8公钥

openssl rsa -RSAPublicKey_in -in public.pkcs1.pem -pubout -out public.pkcs8.pem

openssl生成的RSA私钥, 与 ssh-keygen生成的私钥, 格式相同,但是公钥格式不相同

  1. 使用openssl genrsa工具产生公钥指数为3密钥对。

    首先产生私钥,使用如下命令(因为默认的是2048位,因此这里没有传入key len):

    openssl genrsa -out private.pkcs1.pem 2048

    默认2048位, -3 表示公钥指数e=3的RSA2048密钥对,提高验证签名的效率

    openssl genrsa -3 -out private.pkcs1.pem

  2. 从pkcs1私钥中生成pkcs8公钥

    使用如下命令:openssl rsa -pubout -in private.pkcs1.pem -out public.pkcs8.pem

  3. 使用ssh-keygen将pkcs8公钥转换成ssh格式

    ssh-keygen -i [-m key_format] [-f input_keyfile]

    ssh-keygen -f public.pkcs8.pem -i -mPKCS8 > pub.pem

转换完成的 priv.pem 和 pub.pem 即为符合ssh-keygen格式的密钥对。

openssl rsa命令生成RSA Key时,有3种可选格式,分别为PEM,DER和NET, 通过-inform参数指定,默认为PEM。

DER: 原始的RSA Key按照ASN1 DER编码的方式存储
PEM: DER经过base64编码转换为PEM格式
NET: OpenSSL的帮助提示显示,NET是一个同老式的Netscape server和微软IIS .key文件兼容的格式

私钥:PEM --(convert)--> DER

openssl rsa -inform PEM -in Key0.pem -outform DER -out Key0.der

公钥:PEM --(convert)> DER

openssl rsa -inform PEM -in Key0_pub.pem -pubin -outform DER -out Key0_pub.der

注意: PEM是DER格式进行base64编码的格式,那PEM通过base64解码应为DER格式:

私钥:PEM --(base64 decode)--> DER

openssl base64 -d -in Key0.pem -out Key0.bin

公钥:PEM --(base64 decryption)--> DER

openssl base64 -d -in Key0_pub.pem -out Key0_pub.bin

DER转PEM格式

使用openssl rsa命令转换:

私钥:DER --(convert)--> PEM

openssl rsa -inform DER -in Key0.der -outform PEM -out Key0.PEM

公钥:DER --(convert)--> PEM

openssl rsa -inform DER -in Key0_pub.der -pubin -outform PEM -out Key0_pub.PEM

使用openssl base64命令转换:

私钥:DER --(encryption)--> PEM

openssl base64 -e -in Key0.der -out Key0.pem

公钥:DER --(encryption)--> PEM

openssl base64 -e -in Key0_pub.der -out Key0_pub.pem

openssl rsa命令 与 openssl base64命令,唯一不同:

后者Key0_pub.pem是通过openssl base64命令得到的文件,

丢失了"-----BEGIN PUBLIC KEY-----“和”-----END PUBLIC KEY-----"这两条注释信息

PEM转TXT格式

直接通过openssl rsa命令的-text参数输出可读的TXT格式:

私钥:PEM --> TXT

openssl rsa -inform PEM -in Key0.PEM -text -out Key0.txt

公钥:PEM --> TXT

openssl rsa -inform PEM -in Key0_pub.PEM -pubin -text -out Key0_pub.txt

注意: 转换为TXT的PEM文件需要包含"-----BEGIN PUBLIC KEY-----“和”-----END PUBLIC KEY-----"标记,没有这个标记转换会失败

TXT转PEM格式

openssl rsa -inform PEM -in Key1.txt -outform PEM -out Key1.pem

TXT文件最后的"-----BEGIN PUBLIC KEY-----“和”-----END PUBLIC KEY-----"部分就是PEM内容

注意: 输入格式和输出格式都需要指定为PEM格式。

为什么输入明明是txt文本,却需要指定为PEM格式呢?

打开Key1.txt文件看下文件格式,除了前面部分RSA Key的各种参数外,

在文件最后面还包含了一段由

"-----BEGIN RSA PRIVATE KEY-----“和”-----END RSA PRIVATE KEY-----"包含的部分。

因此工具在处理输入的TXT文件时,会识别并提取

"-----BEGIN RSA PRIVATE KEY-----“和”-----END RSA PRIVATE KEY-----"字符串中间的部分。

所以, 即使在TXT文件内输入其它的字符,openssl工具也可以正确提取,前提是"BEGIN"和"END"格式字符串内是一个完整的Key。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK