本文档以CentOS8 + GmSSL2.5.4版本为例
1、GmSSL搭建CA
1.1 安装GmSSL
我们知道,Linux下默认只有openssl的发行版,并没有默认安装GmSSL,所以需要手动下载并编译安装。而GmSSL的大部分功能时基于openssl的,所以不能再使用动态编译安装,否则会导致链接冲突。
GmSSL的官方配置文档链接:关于GmSSL 可以参考官方的步骤,但需要注意的是,需要加上一个no-shared的选项,以使用静态编译安装。安装的时候选择合适的目录安装,示例文件夹为/usr/local/gmssl,如:
首先下载zip压缩包,
$ unzip GmSSL-master.zip
$ cd GmSSL-master
$ ./config --prefix=/usr/local/gmssl no-shared
$ make
$ sudo make install
说明:
安装完成之后,还需要将GmSSL命令行工具执行文件添加到系统环境变量。
[@ /]# echo 'export PATH="$PATH:/usr/local/gmssl/bin"' >> ~/.bash_profile
[@ /]# source ~/.bash_profile
如果添加了环境变量再使用gmssl还是提示找不到命令,其中一种可能是添加环境变量的身份为root,但使用时使用非root方式,或反过来。
1.2 创建demoCA工作目录
要创建自签CA,首先需要创建一个本地目录demoCA,可以根据实际情况选择路径,并在demoCA文件夹下创建certs、crl、newcerts、private四个文件夹,以及index.txt和serial文件。
以下示例的默认路径为:/home/你的用户名文件夹/Public/demoCA:
[@Public]# mkdir demoCA
[@Public]# cd demoCA
[@demoCA]# mkdir certs crl newcerts private
[@demoCA]# touch index.txt
[@demoCA]# echo '01' >serial
【说明】:
private文件夹:存放的是CA的私钥;
newcerts文件夹:存放新签署的证书;
certs文件夹:存放已颁发的证书;
crl文件夹:存放已吊销的证书;
index.txt:为证书状态的文本数据库文件;
Serial:为当前证书序列号索引文件,会自动计数(16进制)并累积,设置初始值为01。
1.3 修改配置文件
创建好demoCA的工作目录后,需要配置gmssl的配置文件,才能使之识别目录并生效。找到安装路径下/usr/local/gmssl/openssl.cnf文件。
使用命令修改:
[@/usr/local/gmss]# sudo vim openssl.cnf
找到[ CA_default ]行
暂时修改以下部分,根据demoCA创建的路径修改对应内容:
[ CA_default ]
dir = /home/kds/Public/demoCA
certs = /home/kds/Public/demoCA
crl_dir = /home/kds/Public/demoCA/crl
database = /home/kds/Public/demoCA/index.txt
new_certs_dir = /home/kds/Public/demoCA/newcerts
certificate = /home/kds/Public/demoCA/cacert.pem
serial = /home/kds/Public/demoCA/serial
private_key = /home/kds/Public/demoCA/private/cakey.pem
实例如下:
说明:这里的路径是实例创建的demoCA的路径,是让gmssl能够识别CA。如果在实际使用时,出现诸如“找不到根密钥、找不到根证书、找不到index.txt”等错误,即为配置路径有误,检查配置文件并修改即可。
1.4 生成CA
(1)生成根密钥
进入demoCA/private,使用如下实例命令创建SM2根密钥
[@demoCA]# cd private/
[@private]# gmssl ecparam -genkey -name sm2p256v1 -text -out cakey.pem
(2)生成根CA证书
使用如下命令将根据刚生成的根密钥生成根CA的证书。
[@private]# gmssl req -new -x509 -key cakey.pem -out cacert.pem
需要填充以下一些信息,如下实例:非必选的可输入“.”忽略,其中Common Name为必填项。
全部填写完成后,将生成一个cacert.pem文件。
说明:cakey.pem 应存放于 demoCA/private/ 目录下,cacert.pem 存放于 demoCA/
目录下,将生成的cacert放到demoCA/目录下,1.3的路径配置已经提前将路径配置好了,两者要对应:
[@private]# mv cacert.pem ./..
1.5 添加信任
由于证书是自建的,所以需要把根证书添加到受信任的根证书颁发机构,后续利用此CA签发的证书才会受信任,否则仍然提示不可信。
[@demoCA]# cat cacert.pem >> /usr/local/gmssl/certs/ca-bundle.crt
检查 /usr/local/gmssl/certs路径下的文件:
1.6 签发证书
(1)创建用户证书请求
[@Public]# gmssl ecparam -genkey -name sm2p256v1 -text -out test1.key
[@Public]# gmssl req -new -key test1.key -out test1.csr
说明,在创建请求时要填写的信息中,C(Country)、ST(State)、L(Locality)、O(Organization)要与demoCA证书中一致,如下:
(2)添加证书扩展项
证书的扩展项文件test.ext中主要包括OCSP_uri和crlDistributionPoints以及配置CA的根证书地址。
设置好可以保存到demoCA目录下,内容如下:
[@demoCA]# vim test.ext
# CRL
crlDistributionPoints = @crl_section
# OCSP
authorityInfoAccess = @ocsp_section
[ crl_section]
URI.0 = http://192.168.88.140/crl.pem
[ ocsp_section ]
# CA certificate
caIssuers;URI.0 = http://192.168.88.140/cacert.pem
# verify address
OCSP;URI.0 = http://192.168.88.140:8888
(3)签发
[@Public]# gmssl ca -in test.csr -extfile demoCA/test.ext -out test.crt
-extfile表示使用证书扩展项应用到新生成的证书中,正常将会显示如下,签发过程中会询问确认签发这个证书,输入y即可,中间会检查文本数据库文件index.txt和证书序列号参考文件serial:
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
说明:此时在 /home/kds/Public文件夹下已经有了test1.crt证书了,且在 /home/kds/Public/demoCA/newcerts目录下就可以看到新签发的证书了。证书名会根据serial文件中的数字命名,并自动增长,此示例为01.pem。
同时,demoCA下的文本数据库文件index.txt会自动写入一条数据,如下,V(verified)表示已签发,若后续吊销,此消息会变更,V将变为R(revoked)表示吊销。
此时可以使用证书查看命令,查看证书中的信息:
[@Public]# gmssl x509 -in test1.crt -text
可以看到,证书扩展项中包含了添加的CRL分发点地址和根证书下载地址,以及OCSP的验证地址端口。
1.7 吊销证书
吊销证书指令:
[@Public]# gmssl ca -revoke test1.crt
可以在文本数据库index.txt文件查看证书状态变化,已经吊销:
二、配置OCSP服务
2.1 启动OCSP服务
配置好文件后,gmssl命令行工具就可以启动OCSP服务了:
[@demoCA]# gmssl ocsp -index index.txt -CA cacert.pem -rsigner cacert.pem -rkey private/cakey.pem -port 8888 -text -resp_no_certs
说明:这条命令的含义即,ocsp 表示使用OCSP服务,-index index.txt指定CA文本数据库文件为index.txt,-CA cacert.pem指定CA根证书为cacert.pem,-rsigner cacert.pem表示指定用于签发OCSP响应的证书为cacert.pem,-rkey cakey.pem表示指定用于签发OCSP响应的私钥文件为cakey.pem,-port 8888指定服务端口号为8888,-text表示将结果显示出来。
说明:-resp_no_certs选项可选,用来协定响应数据中不包含证书信息。《GM/T 0014-2012数字证书认证系统密码协议规范》规定,用来签名OCSP响应信息的私钥必须是以下中的一个:
–颁发待校验证书的CA的私钥
–一个被信任的OCSP服务器,它的公钥被OCSP请求方信任
–一个CA指派的OCSP服务器,它具有一张由CA直接特殊颁发的用来表示此OCSP服务器可以为本CA发布OCSP响应的证书。
本示例中搭建自签CA与OCSP服务一体,所以直接使用自签CA的根证书、根密钥来签名响应数据。
执行成功后,会出现“waiting for OCSP client connections…”,如下:
2.2 客户端测试
说明:因为自签CA在局域网中搭建,在局域网内使用OCSP使用正常的OCSP请求,url使用”服务器地址:端口号”即可,如下:
测试客户端主机:192.168.88.128
测试OCSP服务器:192.168.88.139:8888
(1)开放连接端口
首先在搭建OCSP服务的本机上测试OCSP请求:使用127.0.0.1:8888,测试证书为首次生成且已吊销(1.7)的test1.crt,结果如下:
若要在局域网内另一台主机访问OCSP服务,还需要打开防火墙对这个端口的限制,才能让局域网主机连接进来并请求服务。
CentOS8防火墙相关的指令如下:
查看防火墙状态
# systemctl status firewalld
如果不是显示active状态,需要打开防火墙
# systemctl start firewalld
查看所有已开放的临时端口(默认为空)
# firewall-cmd --list-ports
查看所有永久开放的端口(默认为空)
# firewall-cmd --list-ports --permanent
添加临时开放端口
# firewall-cmd --add-port=223/tcp
添加永久开放的端口(例如:223端口)
# firewall-cmd --add-port=223/tcp --permanent
关闭临时端口
# firewall-cmd --remove-port=80/tcp
关闭永久端口
# firewll-cmd --remove-port=80/tcp --permanent
配置结束后需要输入重载命令并重启防火墙以生效配置
# firewall-cmd --reload 或
# systemctl restart firewalld
添加8888端口开放并重启一下防火墙即可,如下:
可以查看此时端口开放情况:
(2)客户机请求测试
在测试主机(192.168.88.128)下进入待校验证书文件目录,使用如下命令进行ocsp请求测试:
[@test]# gmssl ocsp -issuer cacert.pem -cert test1.crt -url http://192.168.88.139:8888
Response verify OK
test1.crt: revoked
This Update: Aug 19 07:58:44 2021 GMT
Revocation Time: Aug 19 06:26:45 2021 GMT
如上,Response verify OK表示响应成功,也可以在命令后面使用-respout test_resp.der将响应的DER编码格式文件输出,此时服务监听窗口显示如下:
以下为请求证书不同状态时客户机接收到的响应结果:
三、CRL配置
3.1 创建crl序列号文件
[@demoCA]# echo ‘01’ >crlnumber
用来标识吊销证书列表的序号,每更新一次crl文件则递增1(16进制)。
3.2 修改配置文件
与OCSP配置一样,找到gmssl安装目录下/usr/local/gmssl/openssl.cnf文件,使用如下命令修改:
[@gmssl]# sudo vim openssl.cnf
说明:主要需要修改以下两部分,其中crlnumber为刚创建的crlnumber文件路径,crl后面crl.pem的路径为我们即将创建的crl吊销列表文件的路径,将其放在demoCA的工作目录下:
3.3 吊销证书和生成CRL
gmssl吊销证书命令为:
[@Publicl]# gmssl ca -revoke xxx.crt
实例如下:
说明:在每次CA吊销证书操作之后,都需要执行一次生成crl的命令,以更新当前的crl列表,生成和查看命令如下:
[@demoCA]# gmssl ca -gencrl -out crl.pem
[@demoCA]# gmssl crl -in crl.pem -text
生成的crl文件的名称(crl.pem要与openssl.cnf文件中配置的对应),且下次重新生成的时候可以使用相同名称以覆盖之前内容,生成新的列表内容。实例如下:
四、Nginx搭建及文件获取
4.1 安装nginx
Nginx是 Web和反向代理服务器,在CA主机配置Nginx以使局域网内其他主机访问CA的相关文件(获取根证书和下载CRL文件),从而进行证书验证。
CentOS8下安装nginx:
[@\]# yum install nginx
默认会直接安装其所需要的所有依赖包,遇到输入敲‘y’即可。
4.2 修改配置
当前版本下的配置文件可以在/etc/nginx/中找到nginx.conf。
管理员权限修改如下部分:
[@nginx]# sudo vim nginx.conf
----
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 192.168.88.140;
root /usr/share/nginx/html;
----
说明:主要是检查80端口监听状态,设置server_name(可以是域名,也可以直接是主机地址),root为nginx代理服务器的根目录,可以使用系统默认,也可以添加自己路径,此示例使用默认路径。
修改完成后使用如下命令重启nginx服务即可:
[@nginx]# systemctl restart nginx
若报错,可能配置文件设置有问题,检查各个选项格式。
4.3 设置下载
注意:4.2设置的根目录若为默认路径,则将CA的根证书和crl文件复制到该目录下即可,crl每生成一次同名crl文件覆盖之前的crl.pem文件,以使其他主机获取到的是最新的crl,并将其复制到nginx根目录下:
[@demoCA]# sudo cp cacert.pem crl.pem /usr/share/nginx/html
也可以直接将4.2根目录设为一个存储有cacert.pem和crl文件的路径(不建议直接使用demoCA路径,因为通过http可以直接访问该文件夹下所有文件;若采用自配置目录设置为根目录,需要设置好目录访问权限问题)。
4.4 根证书及crl文件获取
此时局域网内其他主机均可以通过如下命令下载(防火墙打开80端口(参考2.2)以使其他主机访问本机):
[@Public]# wget http://192.168.88.140/cacert.pem
[@Public]# wget http://192.168.88.140/crl.pem