网上很多关于RSA制作多级证书链的文章,没有发现一个完整SM2多级证书链生成方法,根据RSA的文章各种摸索,进雪山,入沼泽,终于…… !!!BINGO!!!
生成一级CA密钥对
openssl ecparam -genkey -name SM2 -out keys/RootCA.key
CA自签名
openssl req -new -x509 -sm3 -key keys/RootCA.key -out keys/RootCA.cer -days 10000 -subj '/C=CN/O=BJKD/OU=GD_SM2'
生成二级CA密钥对
openssl ecparam -genkey -name SM2 -out keys/SecondCA.key
生成二级CA请求
openssl req -new -sm3 -key keys/SecondCA.key -out keys/SecondCA.csr -days 10000 -subj '/C=CN/O=BJKD/OU=BJ_SM2'
一级CA签发二级CA请求
openssl ca -extensions v3_ca -in keys/SecondCA.csr -config /etc/pki/tls/openssl.cnf -days 10000 -out keys/SecondCA.crt -cert keys/RootCA.cer -keyfile keys/RootCA.key
openssl x509 -in keys/SecondCA.crt -out keys/SecondCA.cer #将crt转换为cer格式
生成三级CA
openssl ecparam -genkey -name SM2 -out keys/ThirdCA.key
生成三级CA请求
openssl req -new -sm3 -key keys/ThirdCA.key -out keys/ThirdCA.csr -days 10000 -subj '/C=CN/O=BJKD/OU=HD_SM2'
二级CA签发三级CA证书
openssl ca -extensions v3_ca -in keys/ThirdCA.csr -config /etc/pki/tls/openssl.cnf -days 10000 -out keys/ThirdCA.crt -cert keys/SecondCA.cer -keyfile keys/SecondCA.key
openssl x509 -in keys/ThirdCA.crt -out keys/ThirdCA.cer #将crt转换为cer格式
三级根签发设备证书
openssl ca -extensions v3_ca -in keys/dev.csr -config /etc/pki/tls/openssl.cnf -days 10000 -out keys/dev.crt -cert keys/ThirdCA.cer -keyfile keys/ThirdCA.key
openssl x509 -in keys/dev.crt -out keys/dev.cer #将crt转换为cer格式
Q&A:
- 报错The mandatory stateOrProvinceName field was missing。
根本原因:证书请求信息(countryName……)需要和CA的匹配 ;可以改/etc/pki/tls/openssl.cnf 下policy有三个match,改成optional
[policy_match]下的对应字段改为optional,改为不匹配模式
ca段的policy中指定为match和supplied一定要指定
- 签发的证书默认使用的摘要算法为sha256,当需要SM3时,需将/etc/pki/tls/openssl.cnf的
[ca] 字段下的
default_md = sha256
改为
default_md = sm3
- 证书编码的转换
PEM转为DER openssl x509 -in cert.crt -outform der -out cert.der
DER转为PEM openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
- windows 安装openssl,通过choco安装,
choco install openssl
,choco安装自行百度,证书链生成步骤windows和linxu一样;