CA 证书

CA 证书是由 CA 机构颁发的一个文件,文件中包含了公钥和公钥持有者的信息,它就像是一张身份证,可以用来核对证书持有者的身份信息。

证书内容

CA 证书是经由 CA 机构进行数字签名过的,包含公钥、公钥拥有者(即申请者)信息、签发者信息、有效期等信息的文件。在 Mac 电脑上的 钥匙串访问 中可以看到电脑中的证书信息,证书部分内容如下图所示。

从图中我们可以看到,证书中包含了很多的信息,目前数字证书的格式遵循 X.509 标准

验证证书

在 HTTPS 通信中,服务器将非对称加密的公钥放置在证书中,然后将证书发送给客户端,客户端收到证书后验证证书,如果验证通过就可以确认公钥来自于服务器。那么,客户端如何验证证书呢?证书又是如何防伪的呢?

证书的验证和防伪需要用到证书中提供了两个信息:签发者使用的签名算法、指纹(签名),其中签名算法是证书签发机构对证书进行签名时所采用的算法。当客户端收到服务器发送过来的证书后,先对证书中的内容(证书内容是明文)进行检查,例如:证书是否在过期、公钥所有者 url 与当前服务器域名是否对应等。接着,为了防止其他人仿造证书(例如:将证书中的公钥和 url 替换成自己的),还需要验证证书的指纹。通过证书中提供的签名算法,生成证书内容的信息摘要,根据摘要算法的特性,如果证书内容被修改了,那么生成的摘要信息肯定就不一样。但是,如果其他人在替换证书内容后,根据新的内容重新生成信息摘要该怎么办呢?

因此,不能只是将证书内容的信息摘要作为指纹,而是使用 CA 机构的私钥对信息摘要进行加密,将加密后的内容作为指纹。客户端在验证时,使用 CA 机构提供的公钥解密指纹,然后将解密后的信息摘要与自己根据证书内容生成的信息摘要进行对比,如果两者相同,则说明证书没有被篡改。这样的话,如果其他人修改了证书内容并重新生成了信息摘要,由于没有 CA 机构的私钥,根本无法生成可以被 CA 机构的公钥解密出来的指纹,就能有效地防止证书被篡改。那么问题来了,如何确保 CA 的公钥是真实可信的呢?显然通过网络传输是无法确保的。事实上,在操作系统(或浏览器)中已经内置了世界上公认可信的 CA 证书,该证书中包含了公钥。这样的机构不会很多,所以完全可以做到内置。

信任链

所谓信任链就是说:A 信任 B,而 B 信任 C,所以 A 也信任 C。事实上,系统中并没有内置世界上所有 CA 机构的证书,只是内置了顶级 CA 机构的证书,而其他机构则通过信任链的方式进行证书的颁发。假设 A 是顶级 CA,系统中内置该机构的证书。B 是 A 的子机构,A 给 B 颁发了 CA 证书,B 给 C 颁发了 CA 证书,客户端验证 C 的证书的过程如下:

  1. 按照上文提到了证书验证方式,检查 C 的证书。
  2. 由于 C 的证书是由 B 颁发的,因此需要先获取 B 的证书,然后使用 B 的证书中的公钥解密指纹并对比信息摘要。
  3. 为了保证 B 的公钥真实可靠,需要验证 B 的证书,而 B 的证书是由 A 颁发的,所以使用 A 的公钥解密指纹并对比信息摘要。
  4. A 的公钥内置在系统中,认为是真实有效地。

通过这种信任链的机制,就能完成对证书的认证。可见,这里的关键之处在于顶级 CA 证书,这类证书通常系统内置,世界公认可信。所以,不要自己手贱乱添加证书啊~~~

The End        Thank You