在国密算法系列中,开源的代码里,Openssl和GmSSL是比较为大家熟悉的开源库。当然,Openssl只是在1.1.1后才开始支持。而且支持的不是套件系列而只是算法系列。在目前流行的Linux操作系统中,前者基本都已经是默认安装了,但是普遍的版本比较低。所以要想使用国密算法,需要升级一下。而后者则是北大一个实验室做的一个开源的国密算法库(它有相当一部分是依赖于Opensssl的)。
一般来说,需要从Github上下载合适的最新版本来使用,目前最新的版本是1.1.1。下面的安装步骤可根据实际的系统环境取舍,此处以CentOS为例:
1、安装需要的依赖环境
sudo yum install libtool perl-core zlib-devel -y
2、下载指定的包
curl -O -L https://github.com/openssl/openssl/archive/OpenSSL_1_1_0g.tar.gz
tar -zxvf OpenSSL_1_1_0g.tar.gz
cd openssl
上下这两种方式都可以,只要合适的版本即可
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1-stable.zip
unzip OpenSSL_1_1_1-stable.zip
cd openssl
3、编译安装
sudo ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
sudo make
sudo make test #这步可以省略
sudo make install
上下两种方式对应上面两种方式,其实没有本质区别
./config --prefix=/usr/local/openssl // 指定安装路径
make && make install
4、配置版本
在上述编译完成后,使用openssl version -a会发现版本仍然是老版本,这里有两种方式升级到新版本,推荐第一种:
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/lib64/openssl /usr/lib64/openssl.old
mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ln -s /usr/local/openssl/lib/libssl.so /usr/lib64/libssl.so
sudo vim /etc/ld.so.conf.d/xx.conf
增加:
/usr/local/openssl/lib
保存后:
sudo ldconfig
也可以使用第二种方式:
sudo vim /etc/profile.d/openssl.sh
增加:
pathmunge /usr/local/openssl/bin
sudo vim /etc/ld.so.conf.d/xx.conf
增加:
/usr/local/openssl/lib
保存后:
sudo ldconfig
好果在安装完成后,执行openssl version ,报找不到某个库,sudo ldconfig一下即可。然后就可以看到新版本了。
5、应用其生成国密证书
第一种:简单测试
cd out/bin #此处--prefix=./out
一级证书
./openssl ecparam -out sm2.key -name SM2 -genkey
./openssl req -config ../ssl/openssl.cnf -key sm2.key -new -out sm2.req
./openssl x509 -req -in sm2.req -signkey sm2.key -out sm2.pem
签发Server证书
./openssl ecparam -out sm2_site.key -name SM2 -genkey
./openssl req -config ../ssl/openssl.cnf -key sm2_site.key -new -out sm2_site.req
./openssl x509 -req -in sm2_site.req -CA sm2.pem -CAkey sm2.key -out sm2_site.pem -CAcreateserial
第二种,全生成使用:
生成根证书(一级证书):
$ openssl genrsa -out /home/xxx/ca.key #此处路径根据实际情况,如果在当前目录下,可以直接生成ca.key
$ openssl req -new -key /home/xxx/ca.key -out /home/xxx/ca.csr
openssl x509 -req -days 3650 -in /home/xxx/ca.csr -signkey /home/xxx/ca.key -out /home/xxx/ca.crt
echo "01" > /home/xxx/serial。
touch /home/xxx/index.txt
openssl ca -gencrl -out /home/xxx/ca.crl -crldays 7
上述即完成了根证书,不过注意,此证书是不受浏览器信任的。
生成服务证书
1)证书的私钥
openssl genrsa -out /home/xxx/server.key
2)申请文件
openssl req -new -key /home/xxx/server.key -out /home/xxx/server.csr
3)根证书签发服务器身份验证证书
openssl ca -in /home/xxx/server.csr -cert /home/xxx/ca.crt -keyfile /home/xxx/ca.key -out /home/xxx/server.crt
4)生成浏览器格式pfx:
openssl pkcs12 -export -clcerts -in /home/xxx/server.crt -inkey /home/xxx/server.key -out /home/xxx/users/server.pfx
生成客户端证书:
1)生成私钥
openssl genrsa -des3 -out /home/xxx/users/users.key 1024
2)生成证书请求文件
openssl req -new -key /home/xxx/users/users.key -out /home/xxx/users/users.csr
3)签发证书
openssl ca -in /home/xxx/users/users.csr -cert /home/xxx/ca.crt -keyfile /home/xxx/users/users.crt
4)生成pfx格式
openssl pkcs12 -export -clcerts -in /home/xxx/users/users.crt -inkey /home/xxx/users/users.key -out /home/xxx/users/users.pfx
注意:在实际的web服务器上使用客户端证书,切记一定要在web服务器上通过根证书对客户端进行验证。
6、错误
在生成证书时有两类错误:
1)生级证书和下级证书的组织名等不一致,导致生成失败。修改成一致重新生成即可。
2)生成客户端证书时最后一步,报更新失败。failed to update database,TXT_DB error number 2。
修改方法是将生成证书过程中的“common name”改成不同的即可。当然还有其它方法,比如删除index文件,生新建立等。
1、初步安装走过的弯路
无论是在官网还是在网上好多的资料中,都是采用官网或者官网扩展的形式来安装的。安装方法见:
http://gmssl.org/docs/quickstart.html
结果就是总是报两个错误:
1)error: while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
2)gmssl: relocation error: gmssl: symbol PBEPARAM_it, version OPENSSL_1_1_0d not defined in file libcrypto.so.1.1 with link time reference
网上有很多解决方法,但使用后都不能解决实际问题。
参看:https://www.cnblogs.com/wangzihong0213/p/10856875.html
直到后来在网上看到一个帖子:
https://blog.csdn.net/weixin_42037232/article/details/86661958
2、成功的方法
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
sudo ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
sudo make
sudo make install
gmssl version
其实从这里也可以看出来,上述安装不成功的,可能还是库的依赖没有找到,而如果这样指定后,则直接找到指定版本就没有问题了。
3、国密证书的生成
1)修改配置文件:
$ vi /usr/local/sslopenssl.cnf
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ] #dir = ./demoCA # Where everything is kept
dir = /home/xxx/demoCA #此处修改
2)创建相关的目录和文件
$ mkdir -p /home/xxx/demoCA
$ cd /home/xxx/demoCA
$ mkdir certs crl newcerts private
$ touch index.txt #索引文件
$ echo "01" > serial #序列号文件
3)创建根证书
生成私钥:
$ gmssl ecparam -genkey -name sm2p256v1 -text -out Root.key -config /usr/local/ssl/openssl.cnf
生成签名请求:
$ gmssl req -new -key Root.key -out Root.req -subj /C=CN/ST=Gg\ Zhu/L=GZ/O=Root/OU=Root\ Sign/CN=RootCA/[email protected]
-config /usr/local/ssl/openssl.cnf
生成证书:
$ gmssl x509 -req -days 3650 -sm3 -in Root.req -signkey Root.key -out RootCA.crt
$ cp RootCA.crt demoCA/
$ cp Root.key demoCA/private/
4)创建二级(中间)证书
生成私钥:
$ gmssl ecparam -genkey -name sm2p256v1 -text -out second.key -config /usr/local/ssl/openssl.cnf
生成客户请求:
$ gmssl req -new -key second.key -out second.req -subj /C=CN/ST=Gg\ Zhou/L=GZ/O=second/OU=second\ Sign/CN=secondCA/[email protected] -config /usr/local/ssl/openssl.cnf
生成证书:
$ gmssl x509 -req -sm3 -days 3650 -CA RootCA.crt -CAkey demoCA/private/Root.key -CAcreateserial -in second.req -out secondCA.crt
证书验证:
$ gmssl verify -CAfile RootCA.crt secondCA.crt
$ cp secondCA.crt demoCA/
$ cp second.key demoCA/private/
转换成pfx:
$ gmssl pkcs12 -export -inkey second.key -in secondCA.crt -out result.pfx -passin pass:123 -passout pass:123
5)生成服务器证书
生成私钥:
gmssl ecparam -genkey -name sm2p256v1 -text -out Server.key -config /usr/local/ssl/openssl.cnf
证书请求生成:
$ gmssl req -new -key Server.key -out Server.csr -subj /C=CN/ST=Gg\ Zhou/L=GZ/O=Server/OU=Server\ Sign/CN=ServerCA/[email protected] -config /usr/local/ssl/openssl.cnf
签发证书:
$ gmssl x509 -req -sm3 -days 3650 -CA RootCA.crt -CAkey demoCA/private/Root.key -CAcreateserial -in Server.csr -out ServerCA.crt
证书验证:
$ gmssl verify -CAfile RootCA.crt ServerCA.crt
通过上述的说明来看,无论是Openssl和GmSSL其国密证书生成的步骤是一样的。参数都有些一样。所以二者之间没有太多的应用上的不同。但是有些细节还是需要仔细的去分析和判别,小心混淆。