-----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 扩展

    2.3.1 单行私钥值format成多行

    有时候配置文件里写的是单行的配置信息,想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