写下这篇时用的是 GmSSL 2.4.4,未来的版本可能命令不一样。
# 生成SM2密钥对 "cakeyGM.pem"
mkdir ~/myCert
cd ~/myCert
mkdir demoCA
mkdir demoCA/private
mkdir demoCA/certs
mkdir demoCA/crl
mkdir demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
od -vAn -N4 -tx1 < /dev/urandom |tr -d ' ' > demoCA/serial
cd demoCA
gmssl sm2 -genkey -out private/cakeyGM.pem
# Self-signed SM2 certificate generation as cacertGM.crt:
# 生成 SM2 自签证书,作为根CA “cacertGM.crt”
gmssl req -new -x509 -key private/cakeyGM.pem -out cacertGM.crt
# 生成SM2密钥对 "testUserGM.key"
cd ..
gmssl sm2 -genkey -out testUserGM.com.key
# 生成证书请求CSR
gmssl req -new -key testUserGM.com.key -out testUserGM.com.csr
# 用一开始生成的CA进行签名
gmssl ca -in testUserGM.com.csr -out testUserGM.com.crt -cert demoCA/cacertGM.crt -keyfile demoCA/private/cakeyGM.pem
# 验签
gmssl verify -verbose -x509_strict -CAfile demoCA/cacertGM.crt testUserGM.crt
有些证书并非标准的 x509 格式,我见过有的证书直接是Base64的内容,这时候需要手动添加一些头和尾的东西:
-----BEGIN CERTIFICATE-----
certificate content in Base64
-----END CERTIFICATE-----
然后可以使用以下方式认证,其中c1是 c2的上级证书
gmssl verify -verbose -partial_chain -trusted c2 c1
# 生成PKCS12,方便导入
cd demoCA
gmssl pkcs12 -export -in cacertGM.crt -inkey ./private/cakeyGM.pem -out DongAnRootCA.p12