CentOS8使用gmssl搭建demoCA及配置OCSP服务

本文档以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 

CentOS8使用gmssl搭建demoCA及配置OCSP服务_第1张图片

【说明】:
private文件夹:存放的是CA的私钥;
newcerts文件夹:存放新签署的证书;
certs文件夹:存放已颁发的证书;
crl文件夹:存放已吊销的证书;
index.txt:为证书状态的文本数据库文件;
Serial:为当前证书序列号索引文件,会自动计数(16进制)并累积,设置初始值为01。

1.3 修改配置文件

创建好demoCA的工作目录后,需要配置gmssl的配置文件,才能使之识别目录并生效。找到安装路径下/usr/local/gmssl/openssl.cnf文件。
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第2张图片
使用命令修改:

 [@/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

实例如下:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第3张图片

说明:这里的路径是实例创建的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文件。
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第4张图片

说明: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路径下的文件:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第5张图片

1.6 签发证书

(1)创建用户证书请求

 [@Public]# gmssl ecparam -genkey -name sm2p256v1 -text -out test1.key
 [@Public]# gmssl req -new -key test1.key -out test1.csr

CentOS8使用gmssl搭建demoCA及配置OCSP服务_第6张图片
说明,在创建请求时要填写的信息中,C(Country)、ST(State)、L(Locality)、O(Organization)要与demoCA证书中一致,如下:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第7张图片
(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:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第8张图片

 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。
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第9张图片
同时,demoCA下的文本数据库文件index.txt会自动写入一条数据,如下,V(verified)表示已签发,若后续吊销,此消息会变更,V将变为R(revoked)表示吊销。
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第10张图片
此时可以使用证书查看命令,查看证书中的信息:

 [@Public]# gmssl x509 -in test1.crt -text

可以看到,证书扩展项中包含了添加的CRL分发点地址和根证书下载地址,以及OCSP的验证地址端口。
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第11张图片

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编码格式文件输出,此时服务监听窗口显示如下:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第12张图片
以下为请求证书不同状态时客户机接收到的响应结果:
图2-1 请求证书状态为good时的响应
图2-2 请求证书状态为revoked时的响应
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第13张图片

三、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的工作目录下:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第14张图片

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文件中配置的对应),且下次重新生成的时候可以使用相同名称以覆盖之前内容,生成新的列表内容。实例如下:
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第15张图片

四、Nginx搭建及文件获取

4.1 安装nginx

Nginx是 Web和反向代理服务器,在CA主机配置Nginx以使局域网内其他主机访问CA的相关文件(获取根证书和下载CRL文件),从而进行证书验证。
CentOS8下安装nginx:

 [@\]# yum install nginx

默认会直接安装其所需要的所有依赖包,遇到输入敲‘y’即可。
在这里插入图片描述

4.2 修改配置

当前版本下的配置文件可以在/etc/nginx/中找到nginx.conf。
CentOS8使用gmssl搭建demoCA及配置OCSP服务_第16张图片
管理员权限修改如下部分:

 [@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代理服务器的根目录,可以使用系统默认,也可以添加自己路径,此示例使用默认路径。

CentOS8使用gmssl搭建demoCA及配置OCSP服务_第17张图片
修改完成后使用如下命令重启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

CentOS8使用gmssl搭建demoCA及配置OCSP服务_第18张图片

你可能感兴趣的:(OpenSSL,linux)