seegongsik
安全

什么是 SSL 证书

上一课,我们用公钥来验证签名。在密钥交换里,在用公钥上锁时,底下都垫着同一个前提:手里的公钥真是那个人的。要是有人在半路把自己的公钥当成那个人的递过来,上锁也好,验证签名也好,对上的都会是错的人。一个从没见过的网站,我们凭什么相信它的公钥?

01

假公钥可能混进来

到目前为止,我们收到公钥就直接信了,理所当然地认为那就是那个人的。可要是我和对方之间夹着一个人,事情就不一样了。那个人把自己的公钥悄悄换掉真的递过来,我毫不知情地用它锁上秘密,他就能用自己的私钥打开来看。看完再用真公钥锁好转过去,两边都察觉不到。这就好比有人在信封上贴了自己家的地址,回信全寄到了他手里。
公钥这个工具本身没有毛病,动摇的只是一件事:它到底是谁的。密钥交换那一课留下的作业,正是这个。

网站
->公钥传递
我
?...
选一下到达的是哪把公钥

选一把要发送的公钥点一下。真的原样到达就安全;半路被换成假的,就能看出秘密会在错的人手里被打开。

两种情况并排一放,区别就很清楚。真的到了什么事都没有,可假的到了,我这边的屏幕上也只是显示收到了一把公钥。公钥只是一串很长的数字,上面没有名牌,光看它分辨不出主人是谁。就像一把没刻名字的钥匙,捡到的人说是他的,你也没法反驳。
所以我们需要的,是有人用值得信赖的方式担保:这把公钥真是那个人的。出面做这个担保的,下面就登场。

02

可信的机构来担保

这时,一个大家都约定信任的机构出场了,它叫认证机构,简称CA。网站把自己的公钥和域名交给CA,CA核实申请者是不是真的管理着那个域名。
核实完毕,CA把公钥、域名、签发者和有效期写进同一份文件,再用自己的私钥签名,就是上一课那种无法伪造的签名。像这样带着CA签名的文件就是证书。这相当于给公钥配上了一张可信的身份证,就像身份证背面写着签发机关一样。

1网站带来公钥
2CA核实是不是真的
3CA签名担保
4打包成证书

依次点发证的步骤。网站交出公钥,CA核实后签名,打包成一张证书。

现在公钥不再孤零零地飘着,CA的签名在背后撑着它。这个签名只有用CA的私钥才做得出,谁也模仿不了。收到证书的人用CA的公钥验证签名,只要对得上,就能相信上面写的公钥属于上面写的域名。
证书还有有效期,过了期的证书就不再算数,就像过期的证件不能再用一样。可还剩一个问题:那个CA的公钥,我们又凭什么相信?

03

浏览器的信任名单,PKI

信任CA的依据比想象中简单。操作系统和浏览器里,从一开始就预装着一份事先审核过的根CA证书名单。这份名单就是信任的起点。
不过,根CA并不直接给每个网站签名。根CA的私钥通常断开网络、严加保管,日常的签发交给根CA担保过的中间CA。所以浏览器从网站证书出发,沿着签名的CA一级一级往上追,碰到信任名单里的根,验证就结束了。这种担保连着担保的整个结构,叫公钥基础设施,简称PKI。

网站证书
验证从这里开始。
^
中间CA
^
根CA信任名单

顺着链条一级一级往上爬。从网站证书出发,经过中间CA,碰到信任名单里的根CA,验证就完成了。

链条的尽头,我们碰到了浏览器早就信任的根CA。根证书是自己给自己签的名,所以对它的信任,来自它在名单里这件事本身。只要链条一节不断地接到这里,连最底下网站的公钥也变得可以信任。
我并不直接认识这个网站,可我信任的根为中间CA担保,中间CA又为网站担保,所以我信它。这就像通过熟人的熟人认识一个人,只要每一环都靠得住,最后那个人也靠得住。那么实际收到证书时,通过和警告靠什么来分?

04

真证书通过,假证书警告

浏览器收到证书后,会依次核对几件事:链条能不能接到信任名单里的根,链上的签名是不是都对,证书上写的域名和正在访问的地址是不是一致,有效期有没有过。
全都对,就通过,地址栏出现一把锁的标记。只要有一样不对,浏览器就弹出一个大大的警告页面,停止连接。把假公钥筛掉的门卫,就是这个验证。

?
选一份证书来验证

把两份证书一份一份验证一下。接得到信任名单的真证书通过,不可信的地方签的假证书弹出警告。

真证书悄悄通过,假证书立刻被警告拦住。上网时碰到这样的警告页面,意思就是别直接点过去,因为它在告诉你:这个网站的公钥没有以可信的方式得到担保。
另外,网站的私钥一旦泄露,证书就算还在有效期内也危险了。所以CA可以吊销这样的证书,也有核查吊销信息的机制。下面把证书守护的东西整理一下。

05

小结

归纳起来是这样:要安全地使用公钥,就得能相信它真属于那个人或那个网站,因为有人会在半路递上假公钥。于是可信的机构CA先核实,再把公钥、域名和有效期写进一份文件并签名,这份文件就是证书。
浏览器事先存着一份根CA名单,顺着证书的签名一级一级往上追,看能不能接到名单上。这样连起来的整张信任之网,就是PKI。

1假公钥危险
2CA签名担保
3顺着追到信任名单
4通过或警告

依次点四个要点回顾一下:假公钥的危险、CA的签名和担保、接到根的链条、通过和警告。

现在你知道了,对一把没见过的公钥,我们凭什么相信它。孤零零飘着的公钥谁的都可能是,带着CA担保的证书却值得信任。每天在地址栏看到的那把锁背后,正是这张证书和这条信任链。
上锁、签名、担保身份,零件都凑齐了。下一课来看,连接网站的那一刻,它们在HTTPS里是怎样一起运转的。

一句话总结要安全地使用公钥,就得能相信这把公钥真属于那个人或那个网站。要是有人在半路把假公钥当成真的递过来,上锁和验证签名就都会对上错的人。于是大家约定信任的认证机构(CA)出场了。CA先核实申请者是不是真的管理着那个域名,再把公钥、域名和有效期写进一份文件,用自己的私钥签名。这份文件就是证书。操作系统和浏览器里预装着根CA名单,日常签发由根CA担保过的中间CA负责。浏览器从网站证书出发,沿着签名一级一级往上追,核对能不能接到名单里的根、签名是不是都对、域名和地址是否一致、有没有过期。全都对就通过,有一样不对就弹出警告。这种担保连着担保的信任之网,就是公钥基础设施(PKI)。说到底,证书就是贴在公钥上的一张可信身份证。
← 安全
如果有帮助,请支持我们