https://www.kawabangga.com/posts/5330

TLS 握手其中关键的一步,就是 Server 端要向 Client 端证明自己的身份。感觉有关 TLS 的内容,介绍握手的原理的有很多,但是介绍证书的并不多,证书是 TLS/SSL 非常关键的一环。本文就尝试说明,证书是用来干什么的,Google 是如何防止别人冒充 Google 的,证书为什么会频繁出问题,等等。

证书是来解决什么问题的?

假设有一个银行叫做 super-bank.com,保存了客户一百亿的现金,客户可以通过登陆他们的网站转账。

这时候一个黑客走进了一家星巴克,连上了星巴克的 WiFi,通过伪造 DHCP 服务,告诉其他使用星巴克 WiFi 的用户:我就是网关,你们要上网的话,让我帮你们转发就可以了!这时候他就可以看到所有用户的用户名密码。

有读者说了,可以用 TLS 加密呀!

这时黑客不知道从哪里搞来了一张签发给 super-bank.com 的证书,然后伪造了一个服务器,告诉用户,相信我,我就是这家银行!

于是又把用户的密码偷走了……

TLS 是如何保证安全的?

那么这里问题出在哪里呢?

就是这张证书。证书的作用是:有且仅有证书的持有者,才是真正的 super-bank.com.

即,证明我是我。

有一个普遍的误解,就是只有证书机构才能签发证书。其实不是的,每个人都可以签发证书,我可以自己创建一个 Root 证书,也可以给任何域名签发证书。证书可以有很多,客户端必须只信任那些“有效”的证书。

那么哪一些证书是可以信任的证书呢?就是权威机构签发的证书。

这个问题有三个参与者:客户端,CA(Certificate Authority, 签发证书的机构), 和网站。

CA,客户端,和网站

这个话题之所以讨论起来比较复杂,我觉得根本原因是因为这三者之间互相联系,又各司其职,在讨论的时候容易弄混了这是谁的指责而搞不清楚问题。所以,这篇文章我使用三个主要部分,对这三者要解决的问题和做的事情分别讨论,希望能够说清楚。

他们的关系是: