看完这篇文章,我奶奶都懂了HTTPS原理( 二 )


文章插图
 
 
也就是说小王可以伪装成服务器,与客户端进行通信 。类似于你与服务端之间多了一个中间商!也就是说协商密钥的过程依然存在漏洞!
有点脑阔疼!还能不能让我安全的上网了!就没有更安全的机制了么? 在协商密钥的过程中,客户端怎么能确定对方是真正的目标服务器呢?怎么证明服务器的身份呢?我们先了解一下数字证书!
数字证书
我们生活中有各种证,有能证明自己是个有身份的人的身份证,有能证明自己读了几年书的毕业证 。
这些证都是由某些权威机关认证、无法伪造的,能证明自己身份的凭据 。
那服务器是不是也能有个类似身份证的东西,在与服务器进行通信的时候证明自己确实是目标服务器而不是小王伪造的呢?
在生活中这些证件都是实实在在能看得见摸得着的,而计算机中的证书是虚拟的,看得见但是摸不着,是数据形式记录的,所以叫数字证书!
客户端第一次与服务器进行通信的时候,服务器需要出示自己的数字证书,证明自己的身份以及自己的公钥,类似如下(实际上就是一堆数据,这里为了直观):
 

看完这篇文章,我奶奶都懂了HTTPS原理

文章插图
 
 
那这个数字证书怎么产生的呢?总不能是服务器自己造一个吧?上面说到了我们生活中的证书是由权威机构颁发的、无法伪造的 。
比如身份证就是由派出所发证、毕业证由教育部发证,如果需要验证真假,只需要上相关的系统输入编号查询就能查到了!那我们数字证书也应该有这两个特性,权威机构颁发、防伪!
CA 机构
CA 机构就是数字证书颁发的权威机构,负责颁发证书以及验证证书的合法性 。
如果服务器需要做个有身份的服务器,就需要向 CA 机构提交申请,当然有钱才好办事,交钱才能给你办证……
服务器向 CA 机构提交申请,需要提交站点的信息如域名、公司名称、公钥等等,CA 审批无误之后就可以给服务器颁发证书了!
客户端在拿到服务器的证书后,就需要验证证书编号是否能在对应的 CA 机构查到,并且核对证书的基本信息如证书上的域名是否与当前访问的域名一致等等,还可以拿到证书中服务器的公钥信息用于协商对称密钥!
证书颁发了,可是又怎么防止伪造,怎么保证在传输过程中不被篡改呢?万一小王截获到数字证书,把公钥改成自己的那不是依然无法保证安全了么?这就需要数字签名了!
数字签名
与公司签过劳动合同的朋友应该都知道,在合同信息的填写中,是不能有涂改的,否则需要重新填写!并且在最后需要甲方和乙方签名并且盖章 。
一旦签名盖章后的合同就具有了法律的效力,合同就不能再修改 。签名和盖章操作就是防止合同伪造,规定不能修改就防止了合同被篡改!
在实际生活中签名、盖章操作是实实在在的动作,作用在具体某个物体上的!
但是我们的数字证书本身就是虚拟的,怎么去给一个虚拟的证书签名盖章呢?数字签名又是什么机制呢?
我们在做权限系统的时候,存储用户密码的时候都会经过 MD5 计算摘要后存储,在登录的时候计算用户填写的密码的 MD5 摘要与数据库存储的摘要进行对比,如果一致则密码正确,否则登录失败!
MD5 是不可逆的,且不同的数据计算出来的摘要是不一样的(当然也有极小的概率会 Hash 碰撞),基于这个特性,就有了数字签名的思路 。
服务器提交自己的基本信息向 CA 机构提出申请,CA 机构在给服务器颁发证书的时候,会连同数字证书以及根据证书计算的摘要一同发送给服务器,且这个摘要是需要经过 CA 机构自己的私钥进行加密的 。
申请流程如下:
 
看完这篇文章,我奶奶都懂了HTTPS原理

文章插图
 
 
啥?不够直观?那我们再来个直观点的!通过下图我们能看到,CA 给服务器颁发的证书是有自己专属的“公章”的 。
 
看完这篇文章,我奶奶都懂了HTTPS原理

文章插图
 
 
哪些 CA 机构对于客户端来说是权威或者说是认可的呢?我们打开 IE 浏览器能看到客户端内置的 CA 机构的信息,包含了 CA 的公钥、签名算法、有效期等等...
 
看完这篇文章,我奶奶都懂了HTTPS原理

文章插图
 
 
服务器在与客户端通信的时候,就会将数字证书和数字签名出示给客户端了 。


推荐阅读