Https的数字证书与数字签名
本文介绍一下
为了解决非对称加密中公匙来源的不安全性。我们可以使用数字证书和数字签名来解决。
1.数字证书的申请
在现实中,有一些专门的权威机构用来颁发数字证书,我们称这些机构为认证中心(CA Certificate Authority)。我们(服务器)可以向这些CA来申请数字证书。申请的过程大致是:自己本地先生成一对密匙,然后拿着自己的公匙以及其他信息(比如说企业名称啊什么的)去CA申请数字证书。CA在拿到这些信息后,会选择一种单向Hash算法(比如说常见的MD5)对这些信息进行加密,加密之后的东西我们称之为摘要。单向Hash算法有一种特点就是单向不可逆的,只要原始内容有一点变化,加密后的数据都将会是千差万别(当然也有很小的可能性会重复,有兴趣的小伙伴鸽巢原理了解一下),这样就防止了信息被篡改。生成摘要后还不算完,CA还会用自己的私匙对摘要进行加密,摘要加密后的数据我们称之为数字签名。最后,CA将会把我们的申请信息(包含服务器的公匙)和数字签名整合在一起,由此而生成数字证书。然后CA将数字证书传递给我们(这里可能会引出另一个疑问,认证中心如何安全的将数字证书传递给服务器的呢?如果在传递的过程中,数字证书被中间人给替换了呢?对于这个问题,其实现在如果我们去申请,那么认证中心是通过https传递给我们的。但是刚开始没有https的时候呢?目前我是不太明白的,有兴趣的同学可以一起研究下,我们就认为数字证书不是谁都能申请的,要经过严格的认证才行,反正数字证书就可以安全的达到服务器)。
2.数字证书怎么起作用
服务器在获取到数字证书后,服务器会将数字证书发送给客户端,客户端就需要用CA的公匙解密数字证书并验证数字证书的合法性。那我们如何能拿到CA的公匙呢?我们的电脑和浏览器中已经内置了一部分权威机构的根证书,这些根证书中包含了CA的公匙。
之所以是根证书,是因为现实生活中,认证中心是分层级的,也就是说有*认证中心,也有下面的各个子级的认证中心,是一个树状结构,计算机中内置的是最*机构的根证书,不过不用担心,根证书的公匙在子级也是适用的。
客户端用CA的公匙解密数字证书,如果解密成功则说明证书来源于合法的认证机构。解密成功后,客户端就拿到了摘要。此时,客户端会按照和CA一样的Hash算法将申请信息生成一份摘要,并和解密出来的那份做对比,如果相同则说明内容完整,没有被篡改。最后,客户端安全的从证书中拿到服务器的公匙就可以和服务器进行安全的非对称加密通信了。服务器想获得客户端的公匙也可以通过相同方式。
下图用图解的方式说明一般的证书申请及其使用过程。