openssl RSA密钥格式PKCS1和PKCS8相互转换
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生成的私钥, 格式相同,但是公钥格式不相同
-
使用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
-
从pkcs1私钥中生成pkcs8公钥
使用如下命令:openssl rsa -pubout -in private.pkcs1.pem -out public.pkcs8.pem
-
使用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。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK