盒子
盒子
文章目录
  1. 描述
  2. openssl工具
  3. SM2证书测试+转化
  4. 证书
    1. 根证书
    2. 使用根证书生成-服务器证书
    3. 使用根证书生成-客户端证书

证书

描述

这两天被国密SM2/SM3/SM4整郁闷了,备记一些证书转换相关吧

  • python2+gmssl没整明白,加密好使,解密不好使
  • PHP openssl(1.1.1b)据说事支持国密了,证书配置好使,RM4加解密好使,RM2/RM3却没整过去
  • C加解密都整过去了,和第三方却对接不上,对方给的数据解密后和Demo(Java版)对应不上

openssl工具

安装phpStudy之后自带的,命令openssl version查看版本:1.1.1b
版本必须再1.1.1以上,否则不支持国密(RM2/RM3/RM4)。

SM2证书测试+转化

  • 生成私钥(默认ec格式)
    • openssl ecparam -genkey -name SM2 -out sm2PriKey.pem
  • 查看密钥明文(必须是EC格式证书)
    • openssl ec -in sm2PriKey.pem -text
    • 备注:公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,使用时根据情况可以去掉前面的04
  • 格式转换
    • ec -> pkcs8
      • openssl pkcs8 -topk8 -inform PEM -in sm2PriKey.pem -outform pem -nocrypt -out sm2PriKeyPkcs8.pem
    • pkcs8 -> pkcs1
      • openssl pkcs8 -inform PEM -in sm2PriKeyPkcs8.pem -outform pem -nocrypt -out sm2PriKeyPkcs1.pem
    • pkcs8 -> ec
      • openssl ec -in sm2PriKeyPkcs8.pem -outform pem -out sm2PriKey2.pem
  • RM2加密说明
    • 加密数据:旧版RM2密文结构(C1C2C3),新版RM2密文结构(C1C3C2)
      • C1为固定的64字节,c2和原始数据一样长,C3为固定的32字节
    • 加密过程中使用了SM3的散列算法(官方叫杂凑算法),这个算法输出为32字节的数据。
    • 加密数据如果04开头,04仅代表是旧版密文模式(C1C2C3),解密时要根据情况转换
    • C1:64字节的随机数
    • C2:真正的密文,跟明文的长度是一样的
    • C3:是杂凑值(32字节)。通过SM3(摘要算法)进行运算得出的。

证书

根证书

# 跟证书key
openssl genrsa -des3 -out root.key 2048
# 跟证书申请
openssl req -new -key root.key -out root.csr
> Country Name (2 letter code) [AU]:CN ← 国家代号,中国输入CN
> State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音
> Locality Name (eg, city) []:BeiJing ← 市的全名,拼音
> Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名: SAIL
> Organizational Unit Name (eg, section) []: ← 可以不输入
> Common Name (eg, YOUR name) []: ← 可以不输入: SAIL ROOT CA
> Email Address []:admin@mycompany.com ← 电子邮箱,可随意填
> A challenge password []: ← 可以不输入
> An optional company name []: ← 可以不输入
# 根证书(100年)
openssl x509 -req -days 36500 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.crt

使用根证书生成-服务器证书

# 创建key
openssl genrsa -des3 -out server.key 2048
# 创建证书申请文件: 注意CN需要填写正确的网站地址(域名/IP)
openssl req -new -key server.key -out server.csr
# 签发有效期10年的证书
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA root.crt -CAkey root.key -CAcreateserial -in server.csr -out server.crt

使用根证书生成-客户端证书

openssl genrsa -des3 -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA root.crt -CAkey root.key -CAcreateserial -in client.csr -out client.crt
# 证书合并
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
openssl x509 -in mycert.crt -out mycert.pem -outform PEM
支持一下
扫一扫,支持一下
  • 微信扫一扫
  • 支付宝扫一扫