linux-运维进阶-31 OpenSSL实现CA证书
OpenSSL实现CA证书
什么是CA
CA,Catificate Authority,通俗的理解就是一种认证机制。它的作用就是提供证书(也就是服务端证书,由域名,公司信息,序列号,签名信息等等组成)来加强客户端与服务器端访问信息的安全性,同时提供证书的发放等相关工作。国内的大部分互联网公司都在国际CA机构申请了CA证书,并且在用户进行访问的时候,对用户的信息加密,保障了用户的信息安全。理论上来说,任何组织或者个人都可以扮演CA的角色,只不过,难以得到客户端的信任,不能推而广之,最典型应用莫过于12306网站,这个网站就是自己给自己颁发的根证书。
目前能够让浏览器默认支持的CA大厂有很多,Windows 操作系统在安装之初,也默认安装了很多受信任的根证书。可以通过控制面板–Internet选项来进行查看。
另外,可以将证书理解为带有额外信息的公钥。
SSL/TLS
SSL/TLS是网络通信过程中非常重要的两个协议。互联网的通信安全就建立在SSL/TLS协议基础之上。他们通过一系列的加密行为保障了通信的安全,是如今互联网通信最主要的应用之一。
SSL/TLS是一个很大的互联网应用,关于他们的介绍互联网上有很多,我们暂时不做详细的介绍。关于SSL/TLS通信的过程大致可以用下面的这张图来进行描述。
十六字真诀
公钥加密,私钥解密
私钥签章,公钥验签
实验准备
CA服务器:192.168.141.132
客户机:192.168.141.69
物理机(就是你的电脑)
OpenSSL
OpenSSL是一套开源软件,在Linux中可以很容易的安装。它能够很容易的完成密钥生成以及证书管理。我们接下来就利用OpenSSL搭建CA证书,并实现证书的申请与分发。
1 | [root@localhost ~]# yum install openssl –y |
CA配置
要手动创建CA证书,就必须首先了解,OpenSSL中关于CA的配置,配置文件位于下面的/etc/pki/tls/openssl.cnf
1 | [root@localhost ~]# cat /etc/pki/tls/openssl.cnf |
找到配置文件中指定的路径
1 | [root@localhost ~]# cat /etc/pki/tls/openssl.cnf | grep dir |
可以看到路径 /etc/pki/CA
创建所需要的文件
这里有一点需要注意,我们的实验环境中包含了一个主机,如果不提前创建这两个文件,那么在生成证书的过程中会出现错误。
我们将文件创建在配置文件中指定的路径下面。
1 | 生成证书索引数据库文件 |
CA 自签名证书(构造根CA)
首先构造根CA的证书。因为没有任何机构能够给根CA颁发证书,所以只能根CA自己给自己颁发证书。
首先生成私钥文件cakey.pem
1 | [root@localhost ~]# openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048 |
更具私钥文件cakey.pem生成自签名证书cacert.pem
1 | [root@localhost ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem |
查看生成的证书cacert.pem
1 | [root@localhost ~]# cd /etc/pki/CA/ |
关闭selinux
1 | [root@localhost CA]# cd |
颁发证书(客户端申请证书)
为客户端颁发ssl证书
- 客户端首先产生一个私钥以及证书请求的公钥
- 客户端将公钥发给CA服务器
- CA服务器为客户端颁发数字签名再传回客户机
我们再开一台虚拟机作为客户端,由于它不是CA服务器,所以就不在/etc/pki/CA/目录下生成私钥和证书等文件了,咱们另外建一个目录来搞。
客户端首先在/root/key/目录下生成一个私钥https.key
1 | [root@localhost ~]# yum install openssl -y #客户端也要装ssl套件 |
客户端再用私钥https.key生成证书请求https.csr
1 | [root@localhost ~]# openssl req -new -key /root/key/https.key -out /root/key/https.csr -days 365 |
客户端将证书请求文件https.csr传到CA服务器的/etc/pki/CA目录下
1 | [root@localhost ~]# cd key |
CA根据客户机发过来的证书请求https.csr生产数字签名https.crt
1 | [root@localhost ~]# cd /etc/pki/CA |
CA将生产好的数字签名再传回客户机
1 | [root@localhost CA]# scp https.crt 192.168.141.69:/root/key |
切换到客户机,看一下的确传过来了
1 | [root@localhost key]# ls |
接下来客户机将自己的密钥https.key传给CA,由CA生成证书cacert.pem传回给客户机。为了不冲突,在CA服务器上新建一个目录/root/test
1 | [root@localhost ~]# mkdir test |
客户机将自己的密钥https.key传给CA
1 | [root@localhost key]# scp https.key 192.168.141.132:/root/test |
由CA生成证书cacert.pem
1 | [root@localhost ~]# openssl req -new -x509 -key /root/test/https.key -days 7300 -out /root/test/cacert.pem |
CA服务器将证书传给客户机
1 | [root@localhost ~]# cd test/ |
切换到客户机,看一下的确传过来了
1 | [root@localhost key]# cd /etc/pki/CA |
客户机使用https保护网站
安装apache和mod_ssl模块
1 | [root@localhost key]# cd |
修改配置文件
1 | [root@localhost ~]# vim /etc/httpd/conf.d/ssl.conf |
放行443端口和https服务,关闭selinux,重启apache服务
1 | [root@localhost ~]# firewall-cmd --add-port={443,80}/tcp --permanent |
这里重启apache服务要放到最后,否则会报错。
windows导入根CA证书
将根linux的证书(就是CA服务器生成的自签名证书,ca.feng.com的那个cacert.pem)导出到windows上,然后将后缀名改为.crt,打开后点击安装证书
1 | [root@localhost ~]# yum install lrzsz -y |
如上图,打开这个CA的自签名证书后就可以看到,颁发者和颁发给都是ca.feng.com,且不受信任,证书信息的标志那里都是一个大大的红色叉叉,我们需要手动安装这个证书,安装到本地计算机后,就受信任了,表示本地计算机信任了这个证书机构给它自己办法的证书。
选择本地计算机,然后点击下一步
安装证书,最后下一步点完成
查看证书
win+r,输入certmgr.msc点击确定即可
我们安装的证书是CA的自签名证书,名字叫做ca.feng.com,安装好之后,我们的电脑会对这个CA机构产生充分的信任,且对于这个CA机构颁发给任何网站的证书都会信任。之前我们的客户机:192.168.141.69搭建了apache服务,也算是有了一个网站了,虽然其网站主页还是下面这个“Testing 123”的页面,但是这个不妨碍我们的浏览器对其网站证书进行安全分析。
访问网站
吊销证书
吊销证书是CA机构做的事,我们不用去做,这里只做方法演示。吊销不会立即生效,要等网站重启。
在根CA上根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,然后吊销证书
# 吊销子客户端的证书 使用revoke 命令
1 | [root@localhost CA]# openssl ca -revoke /etc/pki/CA/https.crt |
指定第一个吊销证书的编号
(指定吊销证书的编号,只有在更新证书吊销列表之前,才需要操作)
1 | # 这条命令与生成证书时指定证书serial 号码的作用是一致的。 |
更新证书吊销列表
前面指定了证书吊销列表编号之后,就可以来更新证书吊销列表了。
1 | [root@localhost CA]# openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem |
查看证书吊销列表的文件
1 | [root@localhost CA]# openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text |
吊销不会立即生效,要等网站重启,这里在客户机重启apache服务
1 | [root@localhost ~]# systemctl restart httpd |
查看吊销后的结果
本篇到此结束。