这把公钥真是那个人的吗,证书
上一课我们见过用私钥签名来做一个无法伪造的标记。可还留着一个缝隙。要用某人的公钥锁消息,或验他的签名,那把公钥得先真是他的才行。要是半路有人悄悄把自己的公钥当成那个人的递了过来呢?我们凭什么说一把公钥真是真的?
假公钥可能混进来
到现在为止我们只是信着一把公钥就用了。
以为收到的公钥理所当然是那个人的。
可这里有个缝隙。
要是我和对方之间夹着个人呢?
那个人不递真公钥,
而是悄悄把自己的公钥递过来,
我不知道,就把它当成真的信了。
那么我锁上的秘密
就被错的人打开了。
公钥本身没毛病,
动摇的是它到底是谁的。
点一下正在发送的公钥。真的原样到达就安全,但要是半路被换的假的到了,你就能察觉危险。
两种情况的差别看到了吧。
真的原样到达,就没问题。
可一旦被换成假的,
我自己就没办法察觉。
光看一把公钥,
看不出它是不是真主人的。
因为公钥上没贴名牌。
所以需要什么就清楚了。
需要某种东西,能可信地担保
这把公钥真是那个人的。
下面来看这份担保由谁来给。
受信任的机构来担保
这里出现了一个大家都信的机构。
认证机构,简称CA。
网站把自己的公钥带到CA。
CA核实它真是那个网站的,
然后这样担保。
这把公钥真是这个网站的。
并用自己的私钥给这份担保加上签名。
就是那个无法伪造的签名。
公钥、网站名、CA的签名
打成一包装进的这份文件,就是证书。
说到底,就是给公钥贴上了可信的身份牌。
依次点发证步骤。CA核实网站公钥,把自己的签名附到担保上,打包成证书。
现在公钥不再独自漂着了。
它背上背了CA签名这份担保。
关键是那个签名无法伪造。
CA的私钥只有CA有。
所以收到证书的人
能用CA的公钥核对那个签名。
签名对得上,担保就是真的,
公钥也确实是上面写的那个网站的。
可这里又卡住一件事。
那个CA又怎么去信呢?
下面来顺着信任之链走走。
浏览器的信任名单,PKI
信任一个CA的依据出乎意料地简单。
浏览器里从一开始就预装着
一份它信任的CA名单。
这份名单就是作为起点的信任。
网站发来证书时,
浏览器去看给它签名的CA。
如果那个CA又受了上一级CA的担保,
就往上一格一格地追。
这样往上追,
一旦碰到信任名单里的CA,
链条就接上了信任,验证就结束了。
这样担保连着担保的整个结构,
就叫公钥基础设施,PKI。
顺着链条一格一格往上爬。从网站证书出发,碰到浏览器信任的CA时,验证就完成了。
顺着链条往上爬,
终于到了信任的起点。
浏览器事先信任的那个CA。
只要链条到那里一节不断地接上,
那么连最底下网站的公钥
都变得可以信任了。
这是担保撑着担保的结构。
哪怕我不直接认识这个网站,
因为我信任的CA为它担保了,我就信。
那么实际收到证书时,
靠看什么来分通过和警告呢?
下面来对比一下那个验证。
真证书通过,假的报警
浏览器收到证书时,
会沉住气核两件事。
先看签名的CA能不能接到信任名单。
再看那个签名实际对不对得上。
两样都对,证书就通过。
地址栏冒出一把锁的标记,
你就能安心地收发秘密。
反过来,要是名单上没有的地方签的,
或签名对不上,或网站名对不上,
浏览器就弹出一个大大的警告。
这个验证就是把假公钥筛掉的门卫。
对比两份证书。能接到信任名单的真证书通过,未受信任的地方签的假证书报警。
真证书悄悄就通过了。
假的立刻被警告挡住了。
那个警告正是护着我们的信号。
用网时碰到一个大大的警告画面,
意思就是别就这么忽略它点过去。
因为那是在通知你,那个网站的公钥
没有被以可信的方式担保过。
第一步里看到的假公钥的危险,
正是这个验证给挡住的。
现在证书护着什么就清楚了。
下面把整件事一次理一理。
来理一理
归成一句话,是这样。
要安全地用一把公钥,
你得能信任它真是那个人的。
因为半路递来假公钥就危险了。
于是受信任的机构CA
签名担保说,这把公钥真是这个网站的。
这份担保文件就是证书。
浏览器事先拿着一份受信任CA名单,
把证书一路追溯到那份名单来验证。
担保对得上就通过,对不上就警告。
这整张信任之网就是PKI。
依次点要点回顾一下。(假公钥危险 -> CA签名担保 -> 顺着追到信任名单 -> 通过或警告)
现在你知道了,判断那把公钥真不真是那个人的,
我们凭的是什么。
独自漂着的公钥会动摇,
但带着CA担保的证书可以信任。
我们每天看到的地址栏那把锁标记背后,
正是这份证书和信任之链。
密码学的几块碎片这样聚到一起,
就能搭出一条真正安全的通信。
上锁、签名、身份担保被编到了一处。
下回我们来看,这些碎片在实际连接里
是怎么一起运作的。