在上周《描述秘钥交换的过程》结尾,笔者有提到为保证密钥交换和数据传输的安全可靠性,会采用CA证书的形式,此篇主要讲一下私有CA的相关的东西。
CA(Certificate Authority)是颁发数字签证的机构,它负责发放和管理数字证书,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。但是公共CA所发放的CA证书基本是收费的,而且价格比较贵,同时考虑到很多企业内部是不使用外网的,因此要建立自己的私有CA。
私有CA的实现可以通过OpenCA和openssl两种途径,其中OpenCA是OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件,但是需要自己去下载安装,笔者这边就使用CentOS自带的openssl来操作。
- 创建私有CA
很多服务在涉及到加密时都要使用证书,此时我们以一个服务器来搭建CA,并发放证书给需要的服务。
1.1 关键配置文件
CA证书的关键配置文件为/etc/pki/tls/openssl.cnf,我们主要是查看这个配置文件中关于文件和目录的说明,以及证书的匹配策略部分。
1.1.1 文件及目录说明
上图为配置文件中关于文件和目录的相关说明,其中:
①/etc/pki/CA约定了颁发CA证书的路径和总目录,CentOS8默认是没有CA目录,需自己创建;
②/etc/pki/CA/certs用于存放证书;
③/etc/pki/CA/crl为证书吊销列表;
④/etc/pki/CA/index.txt是用于存放颁发给所有用户的证书索引数据库;
⑤/etc/pki/CA/newcerts是存放新证书的文件夹;
⑥/etc/pki/CA/cacert.pem为CA自签名证书;
⑦/etc/pki/CA/serial是序列号,即每个证书的编号,需填写一个初始数字,如01,后续颁发的证书编号将在此基础上自动增加;
⑧/etc/pki/CA/crlnumber记录证书吊销列表编号;
⑨/etc/pki/CA/crl.pem为证书吊销列表文件;
⑩/etc/pki/CA/private/cakey.pem为CA私钥。
1.1.2 匹配策略
配置文件中也规定了匹配策略,如果使用policy_match策略,则国家、省/直辖市、公司/组织名称是必须统一的,如果使用policy_match策略,填写信息可不相同(如下图)。
1.2 创建CA所需文件
1.2.1 创建/etc/pki/CA目录
笔者这边是拿CentOS8来创建CA服务器的,由于CentOS8上是没有/etc/pki/CA目录,我们需先创建,同时可以参考CentOS7上自带的目录来创建一些子目录(如下图)。
1.2.2 生成index.txt和serial文件
使用touch命令在/etc/pki/CA下创建index.txt和serial文件;执行 echo 01 > /etc/pki/CA/serial 命令指定颁发的第一个证书的编号(如下图)。
1.2.3 生成CA私钥
进入到/etc/pki/CA目录下,执行 openssl genrsa -out private/cakey.pem 2048 命令即可生成私钥(如下图)。
注意:如果是在CentOS7上操作,直接执行上述命令所生成的文件是不安全的(如下图)。
CentOS7系列执行 umask 066; openssl genrsa -out private/cakey.pem 2048 命令,即可使生成的私钥文件属性变成其他用户不可读(如下图)。
1.2.4 生成CA自签名证书
执行 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem 命令生成自签名证书,在填写CA证书信息时,需要注意配置文件中关于匹配策略的要求,如果不修改配置文件,默认的是执行policy_match策略(如下图)。
命令中,“-new”表示生成新证书签署请求,“-x509”专用于CA生成自签证书,“-key”表示生成请求时用到的私钥文件,“-days”指明证书的有效期,“-out”指明证书的存放路径。
直接查看cacert.pem显示出的内容是基于base64转码过的,执行 openssl x509 -in cacert.pem -noout -text 命令可转为文本格式查看,整数中包含了序号、签名算法、颁发者、颁发给(即所需CA的对象)和有效期等信息(如下图)。
到此,私有CA就正式搭建好了。执行 sz cacert.pem 命令可将证书保存到到电脑桌面查看,查看时需将证书文件后缀改为crt查看(如下图)。
1.3 基于单个服务颁发CA证书
以上考虑的是多种服务需要使用证书的情况,如果仅有单个服务需要CA证书,是没必要单独搭建CA服务器的,比如刚好有个服务叫test,且只有这一个test服务CA证书,执行 openssl req -utf8 -newkey rsa:1024 -subj "/CN=test" -days 3650 -keyout test.key -nodes -x509 -out test.crt 命令,即可生成一个关于test的自签名证书和私钥文件(如下图)。
如果是在CentOS7上操作,生成单个服务的CA更简单。CentOS7进入到/etc/pki/tls/certs目录下,可以发现有一个Makefile文件,执行make命令会显示调用Makefile文件,并可使用make命令直接生成CA证书(如下图)。
假设CentOS7上仅有一个服务叫test2需要证书,执行 make /data/test2.crt 命令,即可生成一个自签名证书和私钥文件保存到/data目录下(如下图)。
- 证书申请
私有CA搭建完毕,即可针对服务申请证书。证书申请分三步:生成证书私钥、基于证书私钥进行证书申请和发放证书。
2.1 生成证书私钥
假设现在有一个叫haha的服务需要申请CA证书,并且将haha的信息放在/data目录下。首先需在/data目录下创建一个haha的总目录,进入到/data/haha目录下,执行 openssl genrsa -out /data/haha/haha.key 2048 命令即可生成证书私钥(如下图,CentOS7系列执行该命令时需加umask 066;)。
2.2 生成证书申请文件
证书申请文件基于证书私钥生成,此时我们相当于使用/data/haha/目录下的haha.key去申请一个新的证书,即执行 openssl req -new -key /data/haha/haha.key -out /data/haha/haha.csr 命令,生成证书申请文件haha.csr并放在/data/haha目录下(如下图)。
根据配置文件中的相关要求,因为默认走的是policy_match策略,故申请时填写的国家、省/直辖市和组织/公司名是必须统一的,其他部分信息不要求统一,“extra”部分可不写。
2.3 颁发证书
假设给haha的CA证书有效期为1000天,执行 openssl ca -in /data/haha/haha.csr -out /etc/pki/CA/certs/haha.crt -days 1000 命令后,可看到CA证书的有效期和颁发给(即haha)的申请内容等信息,输入两个y确定后即可完成CA证书的颁发(如下图)。
此时,我们发现/etc/pki/CA目录下多出了一些文件,如certs中多了haha.crt,newcerts中多了01.pem等,执行 cat index.txt 命令可查看当前已发放的CA证书信息,执行 cat serial 命令可查看下一个证书的编号,“openssl ca -status 证书编号”可查看证书是否有效(如下图)。
也可执行 sz certs/haha.crt 命令将CA证书保存到电脑中查看相关信息(如下图)。
因为电脑无法对保存到电脑的证书进行识别,无法确认安全性,所以haha的证书路径上没有显示跟CA证书信息,如果想修改,打开根证书→点击“安装证书”→点击“当前用户”→选择“将所有的证书都放入下列存储”中的“收信人的根证书颁发机构”,后续确定,再次打来haha的证书,即可看到根证书信息(如下图)。
2.4 证书的重复申请
如果一个服务在已申请了证书的情况下,想再次根据自己的证书秘钥进行二次申请,也是可以实现的。上面已经根据haha的证书申请文件生成过haha.cert证书,假设新生成的证书名称为haha-bew.cert,直接执行 openssl ca -in /data/haha/haha.csr -out /etc/pki/CA/certs/haha-new.crt -days 1000 命令会报错提示已颁发证书,查看/etc/pki/CA/目录,也未生成新的证书(如下图)。
这是因为index.txt.attr文件中默认的subject是要求不同的,将yes改成no,再次执行上述命令,即可再次生成证书(如下图)。
此时certs目录下多出了haha-new.crt证书,查看index.txt时,因为是根据同一份证书申请文件生成,所以除了编号,其他信息时相同的(如下图)。
2.5 跨组织的共有CA的实现
虽然是私有CA,但是也能实现跨国、省/直辖市和组织的共有CA功能。我们以另一个服务heihei为例,假设现在heihei现在是在美国纽约,是属于根证书信息中test公司的分公司,名字叫test-heihei,生成证书文件的步骤与上述haha相同,具体操作如下:
此时我们根据heihei的证书申请文件heihei.csr去颁发证书,会提示报错(如下图)。
这一点就涉及到上面所提到的匹配策略,因为默认执行的policy_match策略,需要将国家、省份/直辖市和组织后的match改为optional,为了省事,也可直接将策略改为policy_anything(如下图)。
修改保存策略后,再次执行 openssl ca -in /data/heihei/heihei.csr -out /etc/pki/CA/certs/heihei.crt -days 1000 命令,即可完成跨组织的CA证书颁发,并可查看证书相关信息(如下图)。
- 证书吊销及吊销列表
3.1 证书吊销
出于各种原因,我们可能要对证书进行吊销。例如上面针对haha的同一个证书申请文件,我们颁发了两个证书会有所重复,现在要对haha-new.crt进行吊销,执行 openssl ca -revoke /etc/pki/CA/newcerts/02.pem 命令即可,我们再查看编号为02的haha-new.crt证书,状态已经变成了revoked不可用了(如下图)。
3.2 证书吊销列表
由于证书吊销了只有根证书知道,其他服务或用户不清楚是否已吊销,为了让其他服务或用户知道某个或某些证书已经吊销,需要生成吊销列表放在一个公共场所。
我们需要先根据配置文件中的路径要求来生成吊销列表文件,首先创建一个/etc/pki/CA/crlnumber文件,并将初始编号设定为01,即执行 echo 01 > /etc/pki/CA/crlnumber 命令(如下图)。
接着执行 openssl ca -gencrl -out /etc/pki/CA/crl.pem 命令生成证书吊销列表文件(如下图)。
假设heihei在国外的分公司垮了,对heihei的证书也进行吊销,吊销过后,需再次执行 openssl ca -gencrl -out /etc/pki/CA/crl.pem 生成吊销列表(如下图)。
执行 sz crl.pem 命令,将吊销列表保存到桌面,文件后缀改为crl,打开后可查看吊销列表信息,如果是企业,也可放于网站或者其他地方便于用户查看(如下图)。