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。