介绍完HTTPS原理之后,我们再来回到小明和小红的故事来加深理解。看起来让小红寄未上锁盒子的方案很完美,但是,假如小红寄过来的盒子被人调包了呢?调包的话打开情书的钥匙就被别人拿走了。所以这时候需要有一家在江湖上比较有威望的镖局(假设叫龙门镖局)来帮忙押送小红的盒子,当小明收到盒子时,如果是镖局亲自送过来的、并且说是小红寄的盒子,那么小明就认为这是小红的盒子(小明很信任这家镖局),前面我们说了,这家镖局在江湖上很有威望,为了自己的声誉它必须保证每一趟镖都没问题。有人又会问了,干嘛不直接让镖局���信送过去呢?因为小明写信不可能只写一封,而且每封情书都让镖局来押送成本太大,而且镖局比邮局流程更繁琐,更费时间,如果小明收到一个没听过的镖局送过来的声称是小红寄的盒子,那么他不会相信。
上面例子中,小明是浏览器,小红是服务器,镖局是颁发证书的CA(后面会提到),没听过的镖局就是不受信任的根证书,镖就是证书,信被别人看了叫HTTP明文泄露,信被别人改了叫HTTP劫持,信上的地址被人改了叫DNS劫持,小明寄给小红的盒子是对称加密(因为双方都有钥匙,都能打开),小红寄给小明的没锁的盒子可以看做是非对称加密(因为所有人都可以拿它加密东西,但是一旦加密了就打不开,只有小红一个人有钥匙),镖局自己干坏事自毁前程就等同于沃通的故事,等等。
2.1.5.4. 双向认证双向认证和单向认证原理基本差不多,主要区别是除了客户端需要认证服务端以外,服务端对客户端也需要认证。什么场景下需要验证客户端呢?比如一些银行业务,银行会要求客户必须在电脑上插入它们签发的U盾之类的东西,或者安装什么控件,这里就类似客户端证书的概念,没有这个证书的人无法使用银行提供的业务。
双向认证我没有去亲自尝试,可以参考这篇文章。
下面还是上面那位网友画的双向认证图,我没有仔细考究,先贴在这里:
2.1.6. 引申思考 2.1.6.1. 如何保证公钥不被篡改将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
那如何保证证书可信呢?证书的生成都是由国际顶级认证机构签发的,签发的时候必须验证你是不是这个域名的所有者,只有是才给你签发证书(证书和域名一一挂钩),所以理论上其他人无法伪造你的证书(只是理论上),即使伪造了,浏览器在加载的时候会进行域名校验,如果证书中的域名和实际域名不匹配,浏览器是会警告的。
问题又来了,浏览器怎么知道你的证书是不是合法的国际顶级认证机构签发的呢?操作系统和浏览器都内置了一些他们认为可信任的国际顶级认证机构(CA,后面会提到),只有他们签发的证书浏览器才信任。
2.1.6.2. 为何正式传输时使用对称加密因为非对称加密很慢,而且传输普通内容时双方都已经拿到了随机又没有其他人知道的密码,所以普通的对称加密足矣。
2.2. CA 2.2.1. 何为CACA(Certificate Authority),即证书认证机构,它的作用就是提供证书(即服务器证书,由域名、公司信息、序列号和签名信息组成)加强服务端和客户端之间信息交互的安全性,以及证书运维相关服务。任何个体/组织都可以扮演 CA 的角色,难的是你要能得到全世界各大操作系统、浏览器等的默认信任,能得到他们的默认信任,你也可以自己开一家CA公司了,这类证书通常叫做根证书。浏览器默认信任的 CA 大厂商有很多,比如 Symantec赛门铁克、Comodo、Godaddy、GolbalSign(百度微博等都是它签发的) 和 Digicert。
如何查看操作系统内置了哪些CA呢?Internet选项->内容->证书->受信任的根证书颁发机构:
想让你的https网站默认情况下就被全世界浏览器信任你必须使用它们签发的证书,大部分都是要钱的,当然也有免费的。
很多人一开始应该有和我一样的疑问,我升级我的https,凭啥要到别人那里花钱买证书(即使有免费的也不爽)?,看到这里我想不用再多解释你应该懂了。
2.2.2. CA如果作恶怎么办CA必须是绝对公平公正不作恶的,否则一旦暴露出来一些丑闻,立即会被各大浏览器和厂商拉入黑名单不再信任,或者各种降级处理,带来的后果甚至可能是杀身之祸,比如被360收购的沃通的下场:谷歌宣布开始全面封杀使用沃通CA证书网站,信誉破产的恶果。
沃通的主要罪状有五个:
秘密收购自己的根CA公司startcom;
只要有子域名的权限就可以得到顶级域名的权限,这个很危险,比如github是开放子域名给任何用户的;
伪造证书签署日期;
签署多个相同序列号证书;
邮件恐吓使用其它免费证书的用户说他们的证书不安全;
沃通为何要伪造签署日期呢?