引入
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并实现证书的申请:
openssl的配置文件:/etc/pki/tls/openssl.conf文件,根据该文件中的定义进行配置就可以实现CA的搭建。
打开etc/pki/tls/openssl.conf
这一部分定义了CA所在主机上相关配置文件的存储路径:
指定了使用哪一套CA,即可以有多套类似于CA_default的配置,可以在此处指明使用哪一套CA。
CA的工作目录,所有与CA相关的设置都在该目录下。
人工指定的新证书的路径,当前主机成为CA后,为子CA或客户端签署证书时,生成新证书的路径可人工指定。
证书吊销列表所在文件夹。
证书数据库,保存了证书的状态、编号等信息。默认没有,需手工创建,创建时只需要创建一个空文件,因为随着证书的颁发,系统会自动向其中添加内容。但若没有该文件,会报错。
默认的新证书的路径,当前主机成为CA后,为子CA或客户端签署证书时,生成的新证书会自动存放在该路径下。
$dir/certs是需要人工指定的,若不指定,生成的新证书只会自动存放在$dir/newcerts;若指定了,在$dir/certs和$dir/newcerts目录下都会存放该新证书,两路径下证书的内容相同,名称不同:$dir/certs下的证书名称是执行命令时手工指定的;$dir/newcerts下的证书是以证书的编号来命名的。
当前CA自己的证书,若当前CA是子CA,则该证书是上级CA颁发的;若当前CA是根CA,则该证书是当前CA自己给自己颁发的。
当前颁发证书序列号(十六进制数),当前CA作为签证机构,要为下级CA或客户端颁发证书,serial中保存的实际上是要颁发的下一个证书的编号。/etc/pki/CA/serial默认不存在,需手工创建,且不能为空,即需要指明序列号。
当前吊销序列号(十六进制数)即要吊销的下一个证书的编号。/etc/pki/CA/crlnumber默认不存在,需手工创建,且不能为空,即需要指明序列号。
命名方式和证书选项由ca_default决定。
当前主机成为CA后,为子CA或客户端签署证书时证书的有效期,默认365天。
当前主机成为CA后,为子CA或客户端签署证书时证书的吊销有效期。
这一部分定义了子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.生成私钥文件
genrsa表示使用RSA非对称加密算法生成私钥;
生成的私钥必须在/etc/pki/CA/private这个路径下,且文件名必须为cakey.pem;
私钥文件非常重要,对于生成的私钥文件,最好用umask 066将其权限设为600;除此之外,还可以对私钥文件用对称密钥进行加密,-des3表示使用3DES对称加密算法进行加密。
小括号可以生成子进程,即umask 066只对小括号内新建的文件有效,而不会影响小括号外新建的文件。
2.生成自签名证书
利用生成的私钥给自己签名,生成自签名证书。
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.生成私钥
生成私钥文件,也可以对生成的私钥文件进行对称加密。
2.生成证书签署请求,向CA提交申请
利用私钥生成证书签署请求,以向CA提交申请。
-new: 生成新证书签署请求
-key: 生成请求时用到的私钥文件,即申请者的私钥,此处是客户端提出申请,所以用客户端的私钥。
-out 对客户端来说,此处是生成的请求文件名称及存放的路径。此处指定生成的请求文件名为app.csr,路径为当前路径。请求文件后缀建议用csr
-days客户端期望得到的证书有效期限,证书有效期限一般由CA决定,所以此处可以不写
前面搭建的CA是私有CA,仅供企业内使用,所以设置policy为国家、省、组织名即公司必须匹配,即申请者与CA的国家、省、组织名即公司必须相同,但组织单元即部门可以不同,邮件地址也可以不写。common name对客户端来说,此处是客户端向CA申请得到的证书上的被颁发者。
将请求文件app.csr发送给CA,CA上可以建立一个专门的文件夹,用来存放请求文件
3.CA签署证书
CA收到请求文件后,进行资料审核,若合格,则签署证书,并将证书颁发给请求者。
-in 指定申请者的请求文件
-out 指定生成的证书文件,可以使用crt、pem、csr为后缀
-day指定证书有效期限
CA为申请者颁发证书时需要自己的私钥进行加密,若CA的私钥进行了对称加密,此处使用私钥即要解密私钥文件,就要输入对称密钥进行解密。
由于之前搭建CA时没有创建index.txt,此处报错。
建好index.txt后再次执行命令,由于之前搭建CA时没有创建serial,此处报错。
echo 99>serial 即下一个要颁发的证书编号为99。
图中显示的信息即为申请者提交的信息,从图中可看出,其序列号为99
CA审查无误后就可以签署证书
签署完证书后,数据库进行了更新
数据库更新的同时进行了数据库的备份和序列号的备份
同时,serial中自动更新了下一个要颁发的证书的序列号
serial.old保存的是上一个颁发的证书的序列号
生成的新证书app.crt保存到之前指定的certs目录下,同时自动保存到newcerts目录下,两路径下证书内容相同,newcerts目录下的证书以编号为文件名
将证书发送给申请者。申请者收到该证书文件后,就可以给应用或者服务使用了,例如https等需要加密的服务,使用时要指明证书和私钥的路径。
查看证书,可以直接用cat查看
颁发者
被颁发者
证书有效期
客户端公钥
也可以用以下命令查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text | issuer | subject | serial | dates
-text 查看证书的完整内容
- issuer查看颁发者
-subject查看被颁发者
-serial查看编号
-dates查看有效期
搭建子CA
实验环境:centos6(192.168.25.6)即由刚才的客户端充当子CA
1.创建index.txt和serial文件
2.生成私钥文件
3.生成证书签署请求,向根CA申请证书
因为是子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颁发证书时,证书上显示的颁发者。
将证书签署请求文件发送给根CA
4.根CA为子CA签署证书
子CA也是CA,所以它的证书路径也要放在/etc/pki/tls/openssl.conf文件中规定的/etc/pki/CA下,且文件名必须为cacert.pem。接下来子CA就可以为下级CA或者客户端颁发证书了。
客户端提出证书签署请求
实验环境:centos7(192.168.25.144)(由于此时已搭建子CA,所以客户端向子CA申请)
1.生成私钥文件
2.提出证书签署请求,向子CA提交申请
将证书签署请求文件发送给子CA
3.子CA为客户端签署证书
吊销证书,吊销后还需要将其发布到证书吊销列表中。
由于之前未创建crlnumber文件,所以报错。
更新证书吊销列表
opensslca -gencrl-out /etc/pki/CA/crl/crl.pem