openssl采用sm2进行自签名的方法

系统:centos7
openssl官网:https://www.openssl.org/
openssl 版本高于1.1.1才支持sm2算法

1、编译安装 openssl


下载源码包 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个库文件找不到
openssl采用sm2进行自签名的方法_第1张图片
使用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    ##使环境变量马上生效

openssl采用sm2进行自签名的方法_第2张图片

2、制作 SM2 证书

创建相关文件和目录

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

openssl采用sm2进行自签名的方法_第3张图片

签发证书如果提示“The matching entry has the following details”
openssl采用sm2进行自签名的方法_第4张图片
则需修改配置文件/etc/pki/CA/index.txt.attr,unique_subject改为no
在这里插入图片描述

你可能感兴趣的:(ssl,https,linux,安全,哈希算法)