1、首先配置环境,修改配置文件生成的证书存放在当前环境下
cd /etc/ssl
sudo gedit openssl.cnf
2、新建上面对应的目录
mkdir demoCA
cd demoCA
mkdir certs crl newcerts private
touch index.txt
touch index.txt.attr
touch serial
touch crlnumber
echo "01" > serial
echo "01" > crlnumber
root证书
gmssl ecparam -genkey -name sm2p256v1 -out Root.key
gmssl req -x509 -sm3 -days 3650 -key Root.key -out RootCA.crt
写成脚本:下面生成root 证书相关、server证书相关以及client证书以及CRL相关内容
#!/bin/bash
set -e
dir=`dirname $0`
expire_days=3650
subj=/C="CN"/ST="Beijing"/L="Beijing"/O="Nine"/OU="tester"/CN="nineR"
subji=/C="CN"/ST="Beijing"/L="Beijing"/O="Nine"/OU="tester"/CN="nineI"
subjs=/C="CN"/ST="Beijing"/L="Beijing"/O="Nine"/OU="tester"/CN="nineS"
subj2=/C="CN"/ST="Beijing"/L="Beijing"/O="Nine"/OU="tester"/CN="nine"
subj3=/C="CN"/ST="Beijing"/L="Beijing"/O="Nine"/OU="tester"/CN="nine1"
server="test_sign"
param=$server
if [ -d $param ]; then
rm -r $param
fi
mkdir -p $param
cd $param
ca_name=ca-root-$param
root_cacer=$ca_name.cer
root_capem=$ca_name.pem
root_cakey=$ca_name.key
#ca
ca_name=ca-server-$param
sub1_cacer=$ca_name.cer
sub1_capem=$ca_name.pem
sub1_cakey=$ca_name.key
# client level
client=client-$param
cer=$client.cer
pem=$client.pem
csr=$client.csr
key=$client.key
#chain
chain_cer=chain-$server.cer
chain_crt=chain-$server.crt
#crl
crl=$server.crl
mkdir -p $dir/demoCA/{private,newcerts}
touch $dir/demoCA/index.txt
touch $dir/demoCA/index.txt.attr
echo 15 > $dir/demoCA/serial
echo 15 > $dir/demoCA/crlnumber
cd demoCA
ln -sf ../$root_cacer cacert.pem
cd -
cd demoCA/private
ln -sf ../../$root_cakey cakey.pem
cd -
#Root CA
gmssl ecparam -genkey -name sm2p256v1 -out $root_cakey
gmssl req -x509 -sm3 -key $root_cakey -out $root_cacer -subj $subj -days $expire_days
gmssl x509 -in $root_cacer -out $root_capem
echo "===================Gen Root CA OK===================="
#Server CA
gmssl ecparam -genkey -name sm2p256v1 -out $sub1_cakey
gmssl req -new -sm3 -extensions v3_req -key $sub1_cakey -out $csr -subj $subji -days $expire_days
gmssl ca -md sm3 -extensions v3_ca -batch -notext -in $csr -out $sub1_cacer
gmssl x509 -in $sub1_cacer -out $sub1_capem
echo "===================Gen Sub1 CA OK===================="
#Client cert
gmssl ecparam -genkey -name sm2p256v1 -out $key
gmssl req -new -key $key -out $csr -subj $subj2 -days $expire_days
gmssl ca -md sm3 -batch -notext -in $csr -out $cer -cert $sub1_cacer -keyfile $sub1_cakey
gmssl x509 -in $cer -out $pem
#rm -f *.csr *.srl
echo "===================Gen client cert OK===================="
cat $cer $root_cacer | tee $chain_cer
gmssl x509 -in $chain_cer -out $chain_crt
echo "===================Gen Chain OK===================="
gmssl ca -revoke $sub1_cacer
gmssl ca -gencrl -out $crl
gmssl ca -gencrl -crldays 7 -cert $sub1_cacer-keyfile $sub1_cakey-out $crl
gmssl crl -in $crl -noout -text
echo "===================Gen crl OK===================="
cat $cer $cacer $sub1_cacer |tee $param.pem
echo "===================Gen All OK===================="
3、不同格式证书的编码含义:
.der:用二进制DER编码的证书(.der 后缀的证书都是二进制格式)
.pem:用ASCLL(Base64)编码的证书(.pem 后缀的证书都是base64编码)
.cer:存放公钥,没有私钥;.crt .cer 后缀的文件都是证书文件(编码方式不一定,有可能是.pem,也有可能是.der)
.pfx:存放公钥和私钥(.pfx 主要用于windows平台,浏览器可以使用,也是包含证书和私钥,获取私钥需要密码才可以)X509文件扩展名(x509 这种证书只有公钥,不包含私钥。))
进一步理解DER格式是二进制的,PEM则是文本格式(实际上,PEM格式的内容在去掉"---BEGIN"的内容,采取BASE64解码,得到的BLOG内容,就是DER格式的内容,实际上在GMSSL、OPENSSL中,都是以ASN.1格式进行编码)
4、不同格式的转换
当前用到了DER格式,所以将上述生成的.key文件转换成der编码格式方法:使用openssl(1.1.1f版本)
openssl ec -in ec_prikey.pem -outform der -out ec_prikey.der
gmssl ec -in ec_prikey.pem -outform der -out ec_prikey.der
如果需要转换成其他格式:
gmssl sm2 -inform der -in priv.der -out priv.key
4、gmssl 证书命令了解
gmssl help 可查看gmssl支持的所有的命令