引入    

A和B使用非对称加密方法加密数据进行通讯,则双方均需要知道对方的公钥。若A得到一个声称为B的公钥后,不进行检查就用该公钥加密数据,然后传输,而该公钥实际上是***C的公钥,那么就只有***C的私钥才能解开数据,造成数据泄露。所以A需要对B非公钥进行检查,那么检查合格的依据是B拥有由CA颁发的证明自己身份的证书。CA(Certificate Authority)是签证机构,受通讯双方的信任,负责向通讯双方颁发证书,以证明通讯双方的身份。

以B为例,其申请证书的过程是:CA也有自己的公钥和私钥,首先B利用CA的公钥将自己的公钥加密后发送给CA,CA得到B的公钥后,对B提交的相关资料进行检查,若通过检查,则向B颁发证书。证书内容包括:用CA的私钥对B的公钥加密后所得的数据包、CA的相关信息、算法、证书有效期等。B收到CA颁发的证书后,将证书发送给A,由于A事先已有CA的公钥,则可以解得B的公钥,并且该公钥值是值得信任的。同理B也可以得到A的公钥,接下来A、B就可以进行数据传输。

那么A、B怎样确定CA的公钥是可信的呢?这需要CA向根CA申请证书,申请过程类似。证书内容包括:用根CA的私钥对CA的公钥加密后所得的数据包、根CA的相关信息、算法、证书有效期等。CA收到根CA颁发的证书后,将证书发送给A、B,由于A事先已有根CA的公钥,则可以解得CA的公钥,并且该公钥是值得信任的。

那么A、B怎样确定根CA的公钥是可信的呢?由于已经没有上级CA,所以根CA自己为自己颁发证书,证书内容包括:用根CA的私钥对根CA的公钥加密后所得的数据包、根CA的相关信息、算法、证书有效期等,即自己证明自己的身份,而A、B只能选择信任根CA。

Linux操作系统中的主机中已经安装了根证书,用来证明自己的身份。

PKI: Public Key Infrastructure

  • 签证机构:CA(Certificate Authority)

  • 注册机构:RA(签证机构和注册机构可能不一样)

  • 证书吊销列表:CRL

  • 证书存取库:

  • X.509:定义了证书的结构以及认证协议标准:版本号、序列号、签名、算法、颁发者、有效期限、主体名称、主体公钥、CRL分发点、扩展信息、发行者签名

证书类型:

  • 证书授权机构的证书:根CA的证书(自签名的证书,即自己给自己颁发证书);子CA的证书(由上级CA颁发)

  • 服务器证书(服务器要向外提供web服务,需要申请证书用来证明服务器的身份)

  • 用户证书(当用户发送邮件或进行其他操作时用来证明用户的身份)

获取证书两种方法:

  • 使用证书授权机构

(1)生成签名请求(csr)

(2)将csr发送给CA

(3)从CA处接收签名

  • 自签名的证书

自已签发自己的公钥

CA的搭建与申请

在企业内部,可以搭建一个私有CA,对于https等需要加密的服务,可以通过向CA申请证书来实现加密通讯。

OpenSSL软件包大概可以分成三个主要的功能部分:SSL协议库、应用程序以及密码算法库。OpenSSL可以用户密码、生成随机数,实现单向加密,对称加密、非对称加密,在此基础上,实现密钥证书管理。OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。

下面通过openssl搭建CA并实现证书的申请:

wKiom1m-ilKATsFCAAEk1ZY3Agc670.png

openssl的配置文件:/etc/pki/tls/openssl.conf文件,根据该文件中的定义进行配置就可以实现CA的搭建。

wKioL1m-iiOwImQlAABTQSgMg4g064.png


打开etc/pki/tls/openssl.conf

wKiom1m-ilKTKQnhAAFOj-FUkr4321.jpg

这一部分定义了CA所在主机上相关配置文件的存储路径:

wKiom1m-ilKT20VbAABfkyOdKC4295.png

指定了使用哪一套CA,即可以有多套类似于CA_default的配置,可以在此处指明使用哪一套CA。

wKioL1m-iiOgww5sAAAVEavnuzs366.jpg

CA的工作目录,所有与CA相关的设置都在该目录下。

wKioL1m-iiOzVrHNAABN3UuJMvg912.png

人工指定的新证书的路径,当前主机成为CA后,为子CA或客户端签署证书时,生成新证书的路径可人工指定。

wKiom1m-ilPCle0wAAAUv-NwzPQ849.jpg

证书吊销列表所在文件夹。

wKioL1m-iiOxc4XbAABcsY_TpS0846.png

证书数据库,保存了证书的状态、编号等信息。默认没有,需手工创建,创建时只需要创建一个空文件,因为随着证书的颁发,系统会自动向其中添加内容。但若没有该文件,会报错。

wKiom1m-ilPhdm1jAABgHykJ-1Y758.png

默认的新证书的路径,当前主机成为CA后,为子CA或客户端签署证书时,生成的新证书会自动存放在该路径下。

$dir/certs是需要人工指定的,若不指定,生成的新证书只会自动存放在$dir/newcerts;若指定了,在$dir/certs和$dir/newcerts目录下都会存放该新证书,两路径下证书的内容相同,名称不同:$dir/certs下的证书名称是执行命令时手工指定的;$dir/newcerts下的证书是以证书的编号来命名的。

wKioL1m-iiSRCQhcAAAU_l9pPko397.jpg

当前CA自己的证书,若当前CA是子CA,则该证书是上级CA颁发的;若当前CA是根CA,则该证书是当前CA自己给自己颁发的。

wKiom1m-ilOAj79EAAATrMnlSYs305.jpg

当前颁发证书序列号(十六进制数),当前CA作为签证机构,要为下级CA或客户端颁发证书,serial中保存的实际上是要颁发的下一个证书的编号。/etc/pki/CA/serial默认不存在,需手工创建,且不能为空,即需要指明序列号。

wKioL1m-iiSx0g6kAACUeonruiY998.png

当前吊销序列号(十六进制数)即要吊销的下一个证书的编号。/etc/pki/CA/crlnumber默认不存在,需手工创建,且不能为空,即需要指明序列号。

wKiom1m-ilTw6i8-AABSWWZUZn4512.png

当前CA的私钥。wKiom1m-ilSQOqpkAADFt5k2-3E828.png

命名方式和证书选项由ca_default决定。

wKioL1m-iiTxMAJEAAAS5BdMzP4881.jpg

当前主机成为CA后,为子CA或客户端签署证书时证书的有效期,默认365天。

wKioL1m-iiXi8sS3AAAWpVMpxYI880.jpg

当前主机成为CA后,为子CA或客户端签署证书时证书的吊销有效期。

wKiom1m-ilSAOFRlAADLwo8jkIY725.jpg

这一部分定义了子CA或客户端与当前CA的匹配策略:

若搭建的CA是私有CA,仅供企业内使用,可以设置policy为policy_match,即子CA或客户端与当前CA的国家、省、组织名(即公司)必须匹配,但组织单元即部门可以不同,邮件地址也可以不写。对根CA来说,common name是根CA为客户端或子CA颁发证书时,证书上显示的颁发者;对子CA来说,common name是子CA向上级CA申请得到的证书上的被颁发者,以及子CA为客户端或下级CA颁发证书时,证书上显示的颁发者;对客户端来说,common name是客户端向CA申请得到的证书上的被颁发者。

若搭建的CA是公有CA,可以设置policy为policy_anything,即国家、省、组织名、组织单元即部门、邮件地址可以不同。搭建的CA是私有CA,也可以设置policy为policy_anything。

搭建根CA

实验环境:centos7(192.168.25.129)

因为是第一个CA,即根CA,所以只能自己给自己签名。那么就需要有自己的私钥,接下来先生成私钥:

1.生成私钥文件

wKioL1m-jVHSWjWxAAA54IEZ3sY274.png




wKiom1m-jYHBZgt8AABqU5Xj058405.jpg

genrsa表示使用RSA非对称加密算法生成私

生成的私钥必须在/etc/pki/CA/private这个路径下,且文件名必须为cakey.pem;

私钥文件非常重要,对于生成的私钥文件,最好用umask 066将其权限设为600;除此之外,还可以对私钥文件用对称密钥进行加密,-des3表示使用3DES对称加密算法进行加密。

小括号可以生成子进程,即umask 066只对小括号内新建的文件有效,而不会影响小括号外新建的文件。

wKioL1m-jVL***2KAAJRh3Wf2tY044.jpg






















wKiom1m-jYLiu0CEAAAmCkjTnZI032.jpg



2.生成自签名证书

wKioL1m-jVTh548SAATKed0XI80835.png

利用生成的私钥给自己签名,生成自签名证书。

openssl req-new -x509 –key  /etc/pki/CA/private/cakey.pem-days 7300 -out  /etc/pki/CA/cacert.pem

-new: 生成新的证书签署请求

-x509: 表示提出证书签署请求并自己给自己签署颁发证书,专用于根CA生成自签名证书

-key: 生成请求时用到的私钥文件,即申请者的私钥,此处是根CA提出申请然后自己给自己颁发证书,申请者是根CA,所以用根CA的私钥

-days n:申请者期望的证书有效期限,此处因为根CA在提出申请的同时要颁发证书,而且是自己给自己颁发证书,所以可以指定期限。客户端向CA或子CA向上级CA申请时一般不指定,因为证书有效期限是由颁发证书的CA决定的。

-out /PATH/TO/SOMECERTFILE:对自签名的根CA来说,因为根CA在提出申请的同时就要自己给自己颁发证书所以-out表示证书的保存路径,该路径已在/etc/pki/tls/openssl.conf文件中定义,即必须在/etc/pki/CA路径下,且文件名必须为cacert.pem;客户端或子CA提出申请时若在该处指定路径,-out表示生成的申请文件的路径,可以任意指定

虽然根CA自己给自己颁发证书,但也得提交一些必要信息。由于是根CA,所以不用顾虑policy的设置,可以任意填写国家、省、组织名即公司名、城市、组织部门这些信息,邮件地址可填可不填。common name对根CA来说,此处是根CA为客户端或子CA颁发证书时,证书上显示的颁发者;对子CA来说,此处是子CA向上级CA申请得到的证书上的被颁发者,以及子CA为客户端或下级CA颁发证书时,证书上显示的颁发者;对客户端来说,此处是客户端向CA申请得到的证书上的被颁发者。

客户端提出证书签署请求

实验环境:centos6(192.168.25.6)(由于此时还搭建子CA,所以客户端直接向根CA申请)

私钥文件路径根据需要选择:若给web服务器用,可以将私钥文件和申请得到的证书放在web服务器的配置文件中;若给ftp服务器用,可以将私钥文件和申请得到的证书放在ftp服务器的配置文件中。即最好与服务放在一起,但不是必须的,只要将来能找到。

本次实验将生成的私钥文件放在/etc/pki/tls/private下,将申请到的证书放在/etc/pki/tls/certs下。

1.生成私钥

wKiom1m-jwzRXU0FAABVplCMLK4094.jpg

生成私钥文件,也可以对生成的私钥文件进行对称加密。

wKiom1m-jwzBU3pcAAHmsL8Kc9M634.jpg

2.生成证书签署请求,向CA提交申请

wKioL1m-jt3iPCBPAAEjB2wV9N0083.jpg

利用私钥生成证书签署请求,以向CA提交申请。

-new: 生成新证书签署请求

-key: 生成请求时用到的私钥文件,即申请者的私钥,此处是客户端提出申请,所以用客户端的私钥。

-out 对客户端来说,此处是生成的请求文件名称及存放的路径。此处指定生成的请求文件名为app.csr,路径为当前路径。请求文件后缀建议用csr

-days客户端期望得到的证书有效期限,证书有效期限一般由CA决定,所以此处可以不写

前面搭建的CA是私有CA,仅供企业内使用,所以设置policy为国家、省、组织名即公司必须匹配,即申请者与CA的国家、省、组织名即公司必须相同,但组织单元即部门可以不同,邮件地址也可以不写。common name对客户端来说,此处是客户端向CA申请得到的证书上的被颁发者。

wKioL1m-jt3xGnxpAAAyR2cGqPA434.jpg

将请求文件app.csr发送给CA,CA上可以建立一个专门的文件夹,用来存放请求文件

3.CA签署证书

wKiom1m-jw3DDFyIAACxkNgHMO8424.jpg

CA收到请求文件后,进行资料审核,若合格,则签署证书,并将证书颁发给请求者。

-in 指定申请者的请求文件

-out 指定生成的证书文件,可以使用crt、pem、csr为后缀

-day指定证书有效期限

CA为申请者颁发证书时需要自己的私钥进行加密,若CA的私钥进行了对称加密,此处使用私钥即要解密私钥文件,就要输入对称密钥进行解密。

由于之前搭建CA时没有创建index.txt,此处报错。

wKioL1m-jt7iRv3DAAO2_CFR1vA831.png

建好index.txt后再次执行命令,由于之前搭建CA时没有创建serial,此处报错。

echo 99>serial 即下一个要颁发的证书编号为99。

wKiom1m-jxGg3e5xAAXlrO1TLwE324.png


wKioL1m-juGymWAjAAAM084uZiA953.jpg

图中显示的信息即为申请者提交的信息,从图中可看出,其序列号为99

wKiom1m-jxGSfR6YAAA92nmOyx8966.jpg







CA审查无误后就可以签署证书

wKioL1m-j_igejGwAAEXGPY37k4608.png签署完证书后,数据库进行了更新

wKioL1m-kImg_h_XAAAw2K_ZdrE932.jpg

数据库更新的同时进行了数据库的备份和序列号的备份

wKioL1m-kIngr7xuAAAHVFBEU_g832.png


同时,serial中自动更新了下一个要颁发的证书的序列号

wKiom1m-kLmxvYDWAAAQDf4ZdnE416.jpg


serial.old保存的是上一个颁发的证书的序列号

wKiom1m-kLmRpsykAAFXT_DIwt0600.png















wKioL1m-kIrCi5UpAAAc99XX9SI224.jpg



生成的新证书app.crt保存到之前指定的certs目录下,同时自动保存到newcerts目录下,两路径下证书内容相同,newcerts目录下的证书以编号为文件名

wKiom1m-kLmAdCHuAAA4vSnr1dw660.jpg

将证书发送给申请者。申请者收到该证书文件后,就可以给应用或者服务使用了,例如https等需要加密的服务,使用时要指明证书和私钥的路径。

wKioL1m-kIqgOn5vAAAaxzi3gA8511.jpg


wKioL1m-kIrAKRsjAAEheFuIHzo352.jpg

查看证书,可以直接用cat查看

wKiom1m-kLqC9ShkAAAbuZyppSU989.jpg

颁发者

wKiom1m-kLqwx41lAAAj60t8T04600.jpg

被颁发者

wKioL1m-kIrxD0X6AAAdtZsACoM589.jpg



证书有效期

wKiom1m-kLrw2jSbAAB8twRKxp4194.jpg









客户端公钥

wKioL1m-kIyTVAZBAARS-b8sg00042.png

也可以用以下命令查看证书中的信息:

openssl x509 -in /PATH/FROM/CERT_FILE -noout -text | issuer | subject | serial | dates

-text 查看证书的完整内容

- issuer查看颁发者

-subject查看被颁发者

-serial查看编号

-dates查看有效期

wKiom1m-kLyQgBVjAACVYLfPhDA229.jpg

搭建子CA

实验环境:centos6(192.168.25.6)即由刚才的客户端充当子CA

1.创建index.txt和serial文件


wKiom1m-kuWywCP8AADxQBYNFOk701.png





2.生成私钥文件


wKioL1m-krbxmuKZAAE1xxlB4vU483.png











3.生成证书签署请求,向根CA申请证书

wKiom1m-kuaT-w-fAAEl7obrnJU433.jpg

因为是子CA,所以不能自签名,必须向上级CA提交申请,由上级CA为其颁发证书,所以不能加-x509选项。

-new: 生成新的证书签署请求

-key: 生成请求时用到的私钥文件,即申请者的私钥,此处是子CA提出申请所以用子CA的私钥

-days n:申请者期望的证书有效期限,证书有效期限一般由CA决定,所以此处可以不写

-out /PATH/TO/SOMECERTFILE:对子CA来说,-out表示生成的申请文件的路径,可以任意指定

前面搭建的CA是私有CA,仅供企业内使用,所以设置policy为国家、省、组织名即公司必须匹配,即申请者与CA的国家、省、组织名即公司必须相同,但组织单元即部门可以不同,邮件地址也可以不写。因为后来改了根CA即上级CA的policy为policy_anything,所以国家、省、组织名即公司也可以同,common name对子CA来说,此处是子CA向上级CA申请得到的证书上的被颁发者,以及子CA为客户端或下级CA颁发证书时,证书上显示的颁发者。

wKioL1m-krbiga5SAAAw3TsA9po177.jpg

将证书签署请求文件发送给根CA


4.根CA为子CA签署证书

wKiom1m-kumSMVOmAAXni6X8s5Q423.png

























wKiom1m-kurh6eo_AABV6n3yDIE543.jpg







wKioL1m-krvTx_UjAABxvLm1qFk763.jpg



















wKioL1m-krvhFXcLAAEWCmIFvLg595.png




子CA也是CA,所以它的证书路径也要放在/etc/pki/tls/openssl.conf文件中规定的/etc/pki/CA下,且文件名必须为cacert.pem。接下来子CA就可以为下级CA或者客户端颁发证书了。

客户端提出证书签署请求

实验环境:centos7(192.168.25.144)(由于此时已搭建子CA,所以客户端向子CA申请)

1.生成私钥文件


wKiom1m-kuuDHsxgAABH0wQLh0c556.jpg

2.提出证书签署请求,向子CA提交申请

wKioL1m-kryyMoqXAAODBNQjN5I013.png












wKiom1m-ku3hM6vqAALNynCPhdE471.png




将证书签署请求文件发送给子CA

3.子CA为客户端签署证书

wKiom1m-ku2gIzluAAEsLQNgTTw191.jpg











wKioL1m-kr6zfN8DAABNSwuec_I843.jpg








wKiom1m-ku2hkXKaAAAythjDPS0754.jpg












wKioL1m-kr-SWp1YAAR1GiYpT1g242.png






吊销证书,吊销后还需要将其发布到证书吊销列表中。

wKiom1m-kvHRCJxOAATT56VBHVU277.png













wKioL1m-ksKR8VU-AACvGmXjAZU708.jpg



由于之前未创建crlnumber文件,所以报错。

wKioL1m-ksOy0lfpAABNRRJfEi0811.jpg

更新证书吊销列表

opensslca -gencrl-out /etc/pki/CA/crl/crl.pem

wKiom1m-kvORur6vAABxVN9Bw9Q311.png