系统:centos7
openssl官网:https://www.openssl.org/
openssl 版本高于1.1.1才支持sm2算法
下载源码包 openssl-1.1.1n.tar.gz
下载链接https://download.csdn.net/download/weixin_45548465/87513165
解压
tar zxvf openssl-1.1.1n.tar.gz
cd openssl-1.1.1n/
yum安装 gcc,编译安装需要使用 gcc
yum install -y gcc gcc-c++
指定安装路径
mkdir /usr/local/openssl
./config --prefix=/usr/local/openssl
编译安装
make && make install
我机器编译完之后提示找不到 libssl.so.1.1 库文件
ldd /usr/local/openssl/bin/openssl
看到 libssl.so.1.1 libcrypto.so.1.1 这2个库文件找不到
使用root用户建一个软链接即可解决
先用 find 命令找一下这2个库文件具体路径 然后软链接过去
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
将低版本的 openssl 命令改名为 openssl-old
mv /usr/bin/openssl /usr/bin/openssl-old
将新版本的 openssl 加入环境变量
vim /etc/profile.d/env.sh
PATH=$PATH:/usr/local/openssl/bin/
. /etc/profile.d/env.sh ##使环境变量马上生效
创建相关文件和目录
mkdir /usr/local/openssl/ssl/CA ##存放ca证书及密钥和证书请求
mkdir /usr/local/openssl/ssl/newcerts ##存放新签署证书的目录
touch /usr/local/openssl/ssl/index.txt #签署证书的数据记录文件,下面会生成index这个文件
touch /usr/local/openssl/ssl/serial #新证书签署号记录文件下,下面会生成serial这个文件
touch /usr/local/openssl/ssl/crlnumber # 吊销证书用,下面会生成这个文件
echo '01' > /usr/local/openssl/ssl/serial #给文件一个初始号
echo '01' > /usr/local/openssl/ssl/crlnumber #给文件一个初始号
vim /usr/local/openssl/ssl/openssl.cnf
dir = /usr/local/openssl/ssl/ ##修改默认工作目录
private_key = $dir/CA/rootca.key ##根ca私钥存放路径
certificate = $dir/CA/rootcasm2.cer ##根ca公钥存放路径
生成一级CA密钥对
openssl ecparam -genkey -name SM2 -out /usr/local/openssl/ssl/CA/rootca.key
自签发CA证书
openssl req -new -x509 -sha512 -key /usr/local/openssl/ssl/CA/rootca.key -out /usr/local/openssl/ssl/CA/rootcasm2.cer -days 10000 -subj '/C=CN/O=HUB/OU=WUHAN_SM2'
产生crl文件,供吊销证书使用
openssl ca -gencrl -crldays 3650 -out /usr/local/openssl/ssl/crl.pem
生成二级CA密钥对
openssl ecparam -genkey -name SM2 -out /usr/local/openssl/ssl/CA/SecondCA.key
这里ecdsa with sha256可能需要换成sm3,不过在RFC 5349中规定为ecdsa SHA做digest,所以需要做二次开发,这次暂时用这个
生成二级CA请求,注意 subj 要和根 ca 一致,我这里不一致,后面需要改配置
openssl req -new -sha512 -key /usr/local/openssl/ssl/CA/SecondCA.key -out /usr/local/openssl/ssl/CA/SecondCA.csr -subj '/C=CN/O=HUB/OU=WUHAN1_SM2'
一级CA签发二级CA请求
openssl ca -extensions v3_ca -in /usr/local/openssl/ssl/CA/SecondCA.csr -config /usr/local/openssl/ssl/openssl.cnf -days 10000 -out /usr/local/openssl/ssl/CA/SecondCA.crt -cert /usr/local/openssl/ssl/CA/rootcasm2.cer -keyfile /usr/local/openssl/ssl/CA/rootca.key
提示The mandatory stateOrProvinceName field was missing,是因为我的证书请求信息(countryName……)没有和CA的匹配
需要修改/usr/local/openssl/ssl/openssl.cnf文件 [policy_match] 下的对应字段改为optional,改为不匹配模式
ca段的[policy_match] 下的policy中指定为match和supplied一定要指定
修改完后再次签发正常
将crt转换为cer格式
openssl x509 -in /usr/local/openssl/ssl/CA/SecondCA.crt -out /usr/local/openssl/ssl/CA/SecondCA.cer
证书编码的转换
openssl x509 -in cert.crt -outform der -out cert.der ##PEM转为DER
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem ##DER转为PEM
查看证书方法
openssl x509 -in /usr/local/openssl/ssl/CA/SecondCA.crt -noout -text
看看公钥是否是与私钥相一致
openssl ec -in /usr/local/openssl/ssl/CA/rootca.key -pubout -noout -text
签发证书如果提示“The matching entry has the following details”
则需修改配置文件/etc/pki/CA/index.txt.attr,unique_subject改为no