创建私有CA并进行证书申请

少年乘勇气,百战过乌孙。这篇文章主要讲述创建私有CA并进行证书申请相关的知识,希望能为你提供帮助。
    在上周《描述秘钥交换的过程》结尾,笔者有提到为保证密钥交换和数据传输的安全可靠性,会采用CA证书的形式,此篇主要讲一下私有CA的相关的东西。
    CA??(Certificate Authority)??是颁发数字签证的机构,它负责发放和管理数字证书,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。但是公共CA所发放的CA证书基本是收费的,而且价格比较贵,同时考虑到很多企业内部是不使用外网的,因此要建立自己的私有CA。
    私有CA的实现可以通过OpenCA和openssl两种途径,其中OpenCA是OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件,但是需要自己去下载安装,笔者这边就使用CentOS自带的openssl来操作。

  1. ?创建私有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目录下??(如下图)??。



  1. ?证书申请?
    私有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证书颁发,并可查看证书相关信息??(如下图)??。




  1. ?证书吊销及吊销列表?
?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,打开后可查看吊销列表信息,如果是企业,也可放于网站或者其他地方便于用户查看??(如下图)??。
【创建私有CA并进行证书申请】

    推荐阅读