相信大家都知道下载正版软件的重要性。盗版软件可能被恶意篡改过,而且可能带有病毒,窃取你电脑里的信息。但是我们怎么验证软件是正版还是盗版呢?有人肯定会说:“在官网下载的肯定就是正版啦!”确实,那么我们怎么验证一个网站是真正的“官网”呢?这就要用到一个叫做“证书”的东西。

证书是由专门的机构(Certificate Authority,简称CA)颁发的,里面包含了网站的域名。我们用浏览器上网时,可以方便地看到每一个网站的证书,例如在谷歌Chrome浏览器访问“www.google.com”时,点击域名左侧的小锁:

Screen Shot 2021-05-15 at 20.57.52

再点击“证书”(Certificate)按钮,就可以看到详细信息:

Screen Shot 2021-05-15 at 20.58.26

可以看到“www.google.com”这个域名是有证书的,所以我可以信任它。如果你们访问的是其他官网,也会有类似的证书。

但是,我怎么知道这个证书是真的呢?

这就要引入“公钥”和“私钥”的概念了。其实,我们刚才在浏览器里看到的“证书”并不是明文,而是经过加密后的密文,只不过浏览器帮你自动解密了。CA有一对类似于“钥匙”的密钥,称为“公钥”和“私钥”。这对钥匙非常神奇——用其中一把钥匙加密的数据,必须用另一把钥匙才可以解密。此外,私钥是极度保密的,只有CA自己能用,而公钥是公开在CA的网站上的。CA颁发证书时,先用私钥将其加密,再把它颁发出去,这样就只有它的公钥能解开证书。如果我从CA的网站那里拿到公钥,然后成功解密了该证书,那就说明证书真的是它颁发的了。

但是,我怎么知道这个CA不是和骗子一伙的呢?要是骗子自己造了一个假的CA,给自己的假官网颁发了假证书,我又找谁说理去?

答案很简单——让另一个更值得信任的“高级CA”,给这个CA颁发证书。你用CA的公钥验证某网站的证书,那么你也可以用“高级CA”的公钥,验证CA的证书。

但是,我怎么知道这个“高级CA”不是和骗子一伙的呢?要是骗子自己造了一个假的“高级CA”……

答案很简单——让另一个更值得信任的“特级CA”,给“高级CA”颁发证书……

但是……

答案很简单……

但是……

好吧,咱们别套娃了,因为理论上没有什么是不能造假的。但是在现实世界中,我们有一些最高级的CA来颁发所谓的“根证书”,例如微软、苹果、Mozilla用自己本身的存在做担保,给它们信任的下层CA发证书。“根证书”就像树根一样开枝散叶,形成了一棵“信任之树”。如果你信任树根处的微软、苹果或者Mozilla,以及数字证书的认证体系,那么你就可以信任所有下属的CA,以及它们颁发的证书。这是我们在充满欺骗和谎言的世界里所能做到的最好的保障。

这一期我只稍微提及了非对称加密和CA的树状体系。如果你们喜欢这个主题,下一期我会继续深入证书的工作原理,是怎样的算法保证了它的有效性。