CA证书与https讲解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CA证书与https讲解相关的知识,希望对你有一定的参考价值。

参考技术A

想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在信中说:兹有张三先生前往贵公司办理业务,请给予接洽......云云。然后在信上敲上A公司的公章。

张三先生到了 B 公司后,把介绍信递给 B 公司的前台李四小姐。李小姐一看介绍信上有 A 公司的公章,而且 A 公司是经常和 B 公司有业务往来的,这位李小姐就相信张先生不是歹人了。

这里,A公司就是CA证书

◇ 引入中介机构的介绍信

好,回到刚才的话题。如果和 B 公司有业务往来的公司很多,每个公司的公章都不同,那前台就要懂得分辨各种公章,非常滴麻烦。所以,有某个中介公司 C,发现了这个商机。C公司专门开设了一项“代理公章”的业务。

今后,A 公司的业务员去 B 公司,需要带2个介绍信:

介绍信1

含有 C 公司的公章及 A 公司的公章。并且特地注明:C 公司信任 A 公司。

介绍信2

仅含有 A 公司的公章,然后写上:兹有张三先生前往贵公司办理业务,请给予接洽......云云。

某些不开窍的同学会问了,这样不是增加麻烦了吗?有啥好处捏?

主要的好处在于,对于接待公司的前台,就不需要记住各个公司的公章分别是啥样子的;他/她只要记住中介公司 C 的公章即可。当他/她拿到两份介绍信之后,先对介绍信1的 C 公章,验明正身;确认无误之后,再比对介绍信1和介绍信2的两个 A 公章是否一致。如果是一样的,那就可以证明介绍信2是可以信任的了。

“证书”洋文也叫“digital certificate”或“public key certificate”(专业的解释看“ 这里 ”)。

它是用来证明某某东西确实是某某东西的东西(是不是像绕口令?)。通俗地说,证书就好比例子里面的公章。通过公章,可以证明该介绍信确实是对应的公司发出的。

理论上,人人都可以找个证书工具,自己做一个证书。那如何防止坏人自己制作证书出来骗人捏?请看后续 CA 的介绍。

◇ 什么是CA?

CA是Certificate Authority的缩写,也叫“证书授权中心”。(专业的解释看“ 这里 ”)

它是负责管理和签发证书的第三方机构,就好比例子里面的中介——C 公司。一般来说,CA必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。就好比A、B两公司都必须信任C公司,才会找 C 公司作为公章的中介。

CA 证书,顾名思义,就是CA颁发的证书。

前面已经说了,人人都可以找工具制作证书。但是你一个小破孩制作出来的证书是没啥用处的。因为你不是权威的CA机关,你自己搞的证书不具有权威性。

这就好比上述的例子里,某个坏人自己刻了一个公章,盖到介绍信上。但是别人一看,不是受信任的中介公司的公章,就不予理睬。坏蛋的阴谋就不能得逞啦。

文本后续提及的证书,若无特殊说明,均指 CA 证书。

证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;

签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;

在这个过程注意几点:

1.申请证书不需要提供私钥,确保私钥永远只能服务器掌握;

2.证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;

3.内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书;

4.证书=公钥+申请者与颁发者信息+签名;

后续内容的需要,这里插播一段共享密钥加密和公开密钥加密

https很好的解决了http的三个缺点(被监听、被篡改、被伪装),https不是一种新的协议,它是http+SSL(TLS)的结合体,SSL是一种独立协议,所以其它协议比如smtp等也可以跟ssl结合。https改变了通信方式,它由以前的http—–>tcp,改为http——>SSL—–>tcp;https采用了共享密钥加密+公开密钥加密的方式

4.比较完整的过程:

这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

3. 传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4. 客户端解析证书

这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

5. 传送加密信息

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6. 服务段解密信息

服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7. 传输加密后的信息

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8. 客户端解密信息

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。

1.服务器向CA机构获取证书(假设这个证书伪造不了),当浏览器首次请求服务器的时候,服务器返回证书给浏览器。(证书包含:公钥+申请者与颁发者的相关信息+签名)

2.浏览器得到证书后,开始验证证书的相关信息,证书有效(没过期等)。(验证过程,比较复杂,详见上文)。

3.验证完证书后,如果证书有效,客户端是生成一个随机数,然后用证书中的公钥进行加密,加密后,发送给服务器,服务器用私钥进行解密,得到随机数。之后双方便开始用该随机数作为钥匙,对要传递的数据进行加密、解密。

关于https: http://blog.csdn.net/wangjun5159/article/details/51510594

引用参考博客: http://kb.cnblogs.com/page/194742/

关于https的误解: http://www.admin5.com/article/20150523/600106.shtml

数字证书中主题(Subject)中字段的含义

何为SSL/TLS单向认证,双向认证?
单向认证 指的是只有一个对象校验对端的证书合法性。
通常都是client来校验服务器的合法性。那么client需要一个ca.crt,服务器需要server.crt,server.key
双向认证 指的是相互校验,服务器需要校验每个client,client也需要校验服务器。
server 需要 server.key 、server.crt 、ca.crt
client 需要 client.key 、client.crt 、ca.crt

参考技术B CA证书也就是由CA机构颁发的数字证书,通常是指SSL证书。
https是在http基础上加入了SSL层,也就是要部署CA机构颁发的SSL证书才能实现https加密传输。

apache配置CA证书通过https通信

Apache Httpd 2.2 实现https加密通讯

实际生产中CA证书一般是向一些专业认证的国际机构来进行申请的。我们会模拟使用OpenSSL生成的证书,来实现Apache的安全加密通讯,这与实际生产中是类似的。

实验环境准备

主机A:172.16.0.57-------->httpd服务器

主机B:172.16.0.58--------->CA openssl

接下来,我们分两个部分进行,在主机B上搭建CA证书环境,然后在主机A上配置证书环境。

主机B上搭建CA证书环境

CA证书环境中,私钥的名称以及存放路径,还有证书的名称和存放路径都是有一定规则的,所以,如果不明白的话,可以查看/etc/pki/tls/openssl.cnf 文件

1、构建私钥文件

[root@localhost ~]#(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem  2048 )
Generating RSA private key, 2048 bit long modulus .............................................+++ .........................+++ e is 65537 (0x10001)

2、根据私钥文件,创建自签名的根CA证书

证书的名字必须是cacert.pem ,而且存放路径必须是/etc/pki/CA/cacert.pem

[root@localhost ~]#openssl req -new -x509 -key  /etc/pki/CA/private/cakey.pem -days 7300 -out  /etc/pki/CA/cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter \'.\', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:Opt
Common Name (eg, your name or your server\'s hostname) []:ca.pojun.tech
Email Address []:

3、此时如果我们去查看证书的内容话,是可以查看我们刚刚指定的这些信息的。

[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 17076170100312404196 (0xecfabe3b994470e4)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=shandong, L=qingdao, O=pojun.tech, OU=Opt, CN=ca.pojun.tech
        Validity
            Not Before: Sep 29 03:40:10 2017 GMT
            Not After : Sep 24 03:40:10 2037 GMT
        Subject: C=CN, ST=shandong, L=qingdao, O=pojun.tech, OU=Opt, CN=ca.pojun.tech    
    *******************省略了公钥和签名信息*************************

3、创建颁发证书必须的两个文件

如果不提前创建这两个文件,那么在生成证书的过程中会出现错误。
我们将文件创建在配置文件中指定的路径下面。

touch /etc/pki/CA/index.txt

 echo 01 > /etc/pki/CA/serial

在主机A上申请证书

1、首先安装mod_ssl动态模块

首先在主机A上安装mod_ssl 模块 ,然后我们来查看一下这个模块里面都包含哪些内容

[root@CentOS6 ~]$rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf  # 配置文件
/usr/lib64/httpd/modules/mod_ssl.so  # Apache 动态模块
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem

2、生成私钥文件

因为私钥文件是给Web服务器来使用的,所以私钥文件可以存放在web服务器的配置目录下。这样方便管理 。

# 首先创建一个目录用来管理生成的私钥和证书请求文件,可根据自己的实际情况而定
[root@centos6 ~]$ mkdir /etc/httpd/conf.d/ssl

# 生成自己的私钥文件
[root@centos6 ~]$(umask 066; openssl genrsa -out /etc/httpd/conf.d/ssl/httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
.++++++
...++++++
e is 65537 (0x10001)

3、生成证书请求文件

生成自己的证书请求文件,这里的请求文件是要传给主机B(根CA)来申请证书的。其中的域名采用了范域名解析。
也就是说,当我们把所有的环境配置结束之后,就应该使用https://*.a.com的方式来访问网站,这样话,服务器就会自动采用加密的方式来处理我们的请求。

# 生成自己的证书申请文件,以 .csr 结尾的文件。
[root@centos6 ssl]$openssl req -new -key /etc/httpd/conf.d/ssl/httpd.key -out /etc/httpd/conf.d/ssl/httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter \'.\', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shandong
Locality Name (eg, city) [Default City]:yantai
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server\'s hostname) []:*.a.com
Email Address []:

Please enter the following \'extra\' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

4、将证书请求文件发送给证书颁发机构(主机B)

我们需要将证书请求文件发送给证书颁发机构。

[root@centos6 ssl]$scp /etc/httpd/conf.d/ssl/httpd.csr  172.18.2.77:/etc/pki/CA/
root@172.18.2.77\'s password: 
httpd.csr                                        100%  647     0.6KB/s   00:00

5、在根CA(主机B)颁发证书

我们需要将证书请求文件发送给证书颁发机构。

# 根据主机A提交的证书申请内容,生成证书
[root@localhost ~]#openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
*****************中间省略了输出信息***********************

将生成的证书文件颁发给申请者(主机A)

#  前面我们说过,证书文件都存放在/etc/httpd/conf.d/ssl/目录下
[root@localhost ~]#scp  /etc/pki/CA/certs/httpd.crt  172.18.2.66:/etc/httpd/conf.d/ssl/
The authenticity of host \'172.18.2.66 (172.18.2.66)\' can\'t be established.
RSA key fingerprint is 00:c0:e5:a6:39:e9:a7:bb:1b:f4:ab:0d:75:9b:38:b0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added \'172.18.2.66\' (RSA) to the list of known hosts.
root@172.18.2.66\'s password: 
httpd.crt                                         100% 3714     3.6KB/s   00:00

同时将根CA的证书也发送给Web服务器(主机A)。这一点很重要。

[root@localhost ~]#scp  /etc/pki/CA/cacert.pem   172.18.2.66:/etc/httpd/conf.d/ssl/
root@172.18.2.66\'s password: 
cacert.pem                                   100% 1334     1.3KB/s   00:00

在主机A上配置Web服务器

首先配置Web服务器的私钥文件和证书文件,编辑”/etc/httpd/conf.d/ssl.conf”

然后将根CA的证书路径,配置在配置文件中。

 

配置虚拟机主机站点 

 在/etc/httpd/conf.d/目录下创建一个以.conf结尾的文件,并写上:

在ssl.conf文件中进行配置:

我这里是在windows系统上操作的,需要在windows的hosts文件中添加ip映射才可以

 接下来在浏览器中添加根证书

 

最后我们来访问一下:

 好了,这样子就配置成功了。

以上是关于CA证书与https讲解的主要内容,如果未能解决你的问题,请参考以下文章

CA证书 & https通信

CA证书是啥?有啥作用?

通过Go语言创建CA与签发证书

apache配置CA证书通过https通信

SSL证书原理讲解

SSL证书原理讲解