-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC9blXCZeuSuk5CpJvlyFDquyhIonRPaSlSjKYgKd9b9S0i8ubM
COPGWm+c4J48dunrXqPPUeCh4ZPtV63+7P93QMAvsR125ymeisEI9eBie0TWYoWQ
uKc5GCrIICqqe7f9DoM22tzg2h1Y7DadnOF4NZzC3CYBUzQezwyHDlxhdwIDAQAB
AoGBALMK8SXPXUwOqV+V4//YSJrEELwuSA6yj6sFYxMtYH6zCllpCjm5AUh+O9Yj
+4ucvVWI2v1eHxoCcuW2pK85Y+65pAXAyL1m0VEcz9R42MupiGekgNU2YoX0SHj5
br3D8/Jf3W0kaXvvkUsS/Hy0acRMsmBZsXK9oSX9BhI/BiU5AkEA89RhBznRDGNs
wnylWtrG/fME7ixQnS9FBCZJdskQulgaXxigWiU8CPO7JU3tafj4pk9vA3yNyiUM
DvjfWeuKVQJBAMbi26qT0C02hFB9WcmLSS2+64qSsq1ATJ/6cENkdKCU67dbOeQO
PvFJPxFfOjk0Zh/ZZKRSCCfkb7e3P3yhIJsCQD6mOBQKN/tt5HkIW9g/VFfVxFOK
EWCBz8LkL4YU3XZzwrricfkXjhhiv5gzMKhE72aUDFsh+rCQ2ktSiNjq200CQQDD
hUpGi0Hg8PNq3ZBjXpb2bfbJKCaXw9qQe3faCOvO4hhJDVoAJTEjq8pgnalzi1vK
e8FA+ZQjA6QAjBnRv+V5AkEApWk1I9wliCVJGVXjaGaFKYHI/TAL050ABDJ5M6eV
BkD4DwREVeKtoWX0KJyUdRzpuz0NZUHDYzi61mSWnu8ezQ==
-----END RSA PRIVATE KEY-----
用ASN1在线解析PKCS1格式的秘钥,可以看到结果就是一堆数字。
1.2.2 PKCS#8
补充了一些相关信息,不单单只是秘钥值。其实这里可以看到,开头的RSA字眼已经消失了,因为我们能从OID中查看到(后方有图)。
[[私钥]]
-----BEGIN PRIVATE KEY-----
base64 str,每64字节做一次换行。
-----END PRIVATE KEY-----
[[公钥]]
-----BEGIN PUBLIC KEY-----
base64 str,每64字节做一次换行。
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL1uVcJl65K6TkKk
m+XIUOq7KEiidE9pKVKMpiAp31v1LSLy5swI48Zab5zgnjx26eteo89R4KHhk+1X
rf7s/3dAwC+xHXbnKZ6KwQj14GJ7RNZihZC4pzkYKsggKqp7t/0Ogzba3ODaHVjs
Np2c4Xg1nMLcJgFTNB7PDIcOXGF3AgMBAAECgYEAswrxJc9dTA6pX5Xj/9hImsQQ
vC5IDrKPqwVjEy1gfrMKWWkKObkBSH471iP7i5y9VYja/V4fGgJy5bakrzlj7rmk
BcDIvWbRURzP1HjYy6mIZ6SA1TZihfRIePluvcPz8l/dbSRpe++RSxL8fLRpxEyy
YFmxcr2hJf0GEj8GJTkCQQDz1GEHOdEMY2zCfKVa2sb98wTuLFCdL0UEJkl2yRC6
WBpfGKBaJTwI87slTe1p+PimT28DfI3KJQwO+N9Z64pVAkEAxuLbqpPQLTaEUH1Z
yYtJLb7ripKyrUBMn/pwQ2R0oJTrt1s55A4+8Uk/EV86OTRmH9lkpFIIJ+Rvt7c/
fKEgmwJAPqY4FAo3+23keQhb2D9UV9XEU4oRYIHPwuQvhhTddnPCuuJx+ReOGGK/
mDMwqETvZpQMWyH6sJDaS1KI2OrbTQJBAMOFSkaLQeDw82rdkGNelvZt9skoJpfD
2pB7d9oI687iGEkNWgAlMSOrymCdqXOLW8p7wUD5lCMDpACMGdG/5XkCQQClaTUj
3CWIJUkZVeNoZoUpgcj9MAvTnQAEMnkzp5UGQPgPBERV4q2hZfQonJR1HOm7PQ1l
QcNjOLrWZJae7x7N
-----END PRIVATE KEY-----
用ASN1在线解析PKCS8格式的秘钥,可以看到结果在数值之上,追加了OID等信息。
1.3 pem和der
参考:PEM 与 DER 格式详解
PEM 与 DER是用于存储、传输密钥和证书的标准格式,两者紧密关联,可以互相转换。
ASN.1 ------(序列化)------ DER ------(Base64编码)------ PEM
# 对 ASN.1 序列化后,就会生成一个二进制串,这个就是 DER 格式。
# 将二进制进行 Base64 编码,再加上 PEM 格式特有的头尾两行,就生成了 PEM 格式。
1.3.2 DER
类比上面的PKCS#1,Distinguished Encoding Rules,可分辩编码规则。
DER格式文件后缀通常为 .der
和 .cer
,后缀名并不会影响 DER 格式文件的解析。
1.3.1 PEM
类比上面的PKCS#8
PEM格式文件后缀通常为.pem
、.cer
、.crt
、.key
,后缀名并不会影响 PEM 格式文件的解析。
1.3.3 PEM 转 DER
先将 PEM 文件里面首尾的 ----BEGIN xxx----
和 ----END xxx----
两行去掉
再将内容合并为一行(去掉换行符\r\n
)
接着将内容进行 Base64 解码
通过 openssl 命令转换如下:
openssl rsa -in rsa_private.pem -outform DER -out rsa_private.der
1.3.4 DER 转 PEM
先将 DER 二进制内容进行 Base64 编码
再按每行 64 个字节进行切分
最后在切分后的内容前后加上 ----BEGIN xxx----
和 ----END xxx----
通过 openssl 命令转换如下:
openssl rsa -inform DER -in rsa_private.der -outform PEM -out rsa_private2.pem
2.RSA
2.1 私钥部分
2.1.1 生成私钥:PKCS#1
# 1024 秘钥长度
openssl genrsa -out private.pem 1024
# 查看私钥信息
openssl rsa -in private.pem -text
2.1.2 私钥:PKCS1 -> PKCS8
pem格式转der格式
openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out private_pkcs8.pem
2.1.3 私钥:PKCS8 -> PKCS1
openssl rsa -in private_pkcs8.pem -out private_pkcs1.pem
2.2 公钥部分
2.2.1 导出公钥:从PKCS1私钥 导出PKCS8公钥
openssl rsa -in private_pkcs1.pem -pubout -out public_pkcs8.pem
2.2.2 导出公钥:从PKCS8私钥 导出PKCS8公钥
openssl rsa -in private_pkcs8.pem -pubout -out public_pkcs8_2.pem
2.2.3 公钥:PKCS8 -> PKCS1
openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out
# 末尾加上-out 文件名 可以写入文件
openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out -out public_pkcs1.pem
2.2.4 公钥:pkcs1 -> pkcs8
openssl rsa -in public_pkcs1.pem -pubout -RSAPublicKey_in
# 末尾加上-out 文件名 可以写入文件
openssl rsa -in public_pkcs1.pem -pubout -RSAPublicKey_in -out public_pkcs8_3.pem
2.3 扩展
有时候配置文件里写的是单行的配置信息,想format一下,一行一行敲回车太累了。
解析ASN1结构,判断是PKCS8还是PKCS1
PKCS8带扩展信息,PKCS1不带。
根据对应的结构,添加上头尾标识字符。
比如这里添加上PKCS8的头尾信息。
3.1.1 生成私钥:EC格式
# 注意此处默认生成的是ec格式,SM2是基于椭圆曲线的,一般看到EC相关的就可以认为跟SM2相关了。
openssl ecparam -genkey -name SM2 -out sm2_private_ec.key
# 查看私钥信息
openssl ec -in sm2_private_ec.key -text
3.1.2 私钥:EC -> PKCS1
openssl ec -in sm2_private_ec.key -out sm2_private_pkcs1.key
3.1.3 私钥:EC ->PKCS8
openssl pkcs8 -topk8 -inform PEM -in sm2_private_ec.key -outform pem -nocrypt -out sm2_private_pkcs8.key
2.1.4 私钥:PKCS1 -> PKCS8
从EC格式转成PKCS1/PKCS8格式后,其余的命令和RSA那里就是相通的了。
openssl pkcs8 -topk8 -inform PEM -in sm2_private_pkcs1.key -outform pem -nocrypt -out sm2_private_pkcs8_2.key
2.1.5 私钥:PKCS8 -> PKCS1
注意openssl后面的形参从rsa变成了ec
openssl ec -in sm2_private_pkcs8_2.key -out sm2_private_pkcs1_2.key
3.2 公钥部分
2.2.1 导出公钥:从EC私钥 导出PKCS8公钥
openssl ec -in sm2_private_ec.key -pubout -out sm2_public_pkcs8.key
2.2.2 导出公钥:从PKCS8私钥 导出PKCS8公钥
openssl ec -in sm2_private_pkcs8.key -pubout
# 末尾加上-out 文件名 可以写入文件
openssl ec -in sm2_private_pkcs8.key -pubout -out sm2_public_pkcs8_2.key
2.2.3 公钥:PKCS8 -> PKCS1
2.2.4 公钥:pkcs1 -> pkcs8
3.3 签名
3.3.1 PKCS1私钥进行签名
# sha1 plain.txt
openssl dgst -sign private.key -sha1 -out sm2_file.sign plain.txt
3.4 验签
3.4.1 PKCS1公钥验证签名
# sha1 plain.txt
openssl dgst -verify pub.key -sha1 -signature sm2_file.sign plain.txt
4.数字证书
4.1 查看证书序列号
openssl x509 -in xx.cer -noout -serial
4.2 获取证书中的公钥(PKCS8)
openssl x509 -in xx.cer -pubkey -noout > xx.pem