在前面的密码学入门文章(链接)中讲到,为了防范攻击者伪造公钥进行中间人攻击,Alice 和 Bob 想到了使用 数字证书 这个法宝。本篇文章,将具体介绍一下数字证书和 PKI (Public-Key Infrastructure),会举一些例子(比如 12306),还有 PKI 的缺陷以及常见的攻击方式。

(确切来说,数字证书和 PKI 已经不仅限于密码学的范畴,而是偏向于实际应用(即密码技术)。)

什么是数字证书

在网络环境中,数字证书代表了一个通信实体(比如人、系统)的实际身份。就像现实生活中的身份证一样,见证如见人。

有人提出疑问,如果 Trent (CA)是个坏人怎么办?他要是随便给人颁发证书,岂不是乱套了。或者说,我们怎样去选择一个 CA,怎样相信他的权威性和公正度?所以就要讲到 PKI 体系。

PKI 体系

PKI(Public-Key Infrastructure,公钥基础设施),是为了能够更有效地运用公钥而制定的一系列规范和规格的总称。需要注意的是,PKI 是一个总称,而不是特指一个单独的规范或规格。比如,RSA 公司制定的 PKCS (Public-Key Cryptography Standards)系列,ITU(International Telecommunication Union,国际电信联盟)和 ISO(International Organization for Standardzation,国际标准化组织)制定的 X.509 规范,互联网规格 RFC (Request for Comments)的部分规范,甚至各个公司提供的 API 和规格设计书,都属于 PKI 的范畴。

PKI 组成元素

PKI 包括以下三个组成元素:

  • 用户:使用 PKI 的人
  • 认证机构:颁发证书的人,即 CA
  • 仓库:保存证书的地方,也叫作 证书目录

密码学之数字证书及PKI体系 - 图1

图 1 展示了 PKI 的三种组成元素,Alice 和 Bob 都是用户(其中前者是证书使用者,后者是证书注册者),Trent 是认证机构,而仓库用于保管证书并提供证书下载。

PKI 层级体系

Alice 要想验证 Bob 公钥的真实性,需要使用 Trent(CA)的公钥对 Bob 证书上的签名进行验证。那么,谁来验证 Trent 公钥的真实性呢?答案是可以用其他 CA 对 Trent 颁发证书,施加数字签名以达到验证 Trent 公钥的目的。聪明的你一定想到,这肯定是一个迭代树形关系,一级验证一级。

密码学之数字证书及PKI体系 - 图2

Bob 为了防止别人伪造他的公钥,会跟公安局注册一个证书。Alice 拿到 Bob 的证书后,为了验证合法性,需要进行以下步骤:

  • 获取公安部(根 CA)的证书,假设他相信公安部的公钥是合法的。
  • 获取公安厅的证书,并用公安部公钥对其进行验证,验证成功则认为公安厅证书合法,并进入下一步。
  • 获取公安局的证书,并用公安厅的公钥对其进行验证,验证成功则进入下一步。
  • 获取 Bob 的证书,并用公安局的公钥对其进行验证,验证成功则认为 Bob 公钥是合法的。

图中最上层的 CA 叫做根CA(Root CA),它自己给自己颁发证书,这种对自己公钥进行签名的行为称为 自签名(self-signature)。根 CA 一般不会进行所有的认证服务,所以会有很多中间 CA(Intermediate CA)。一般情况下,通信实体直接接触(比如注册证书等)的是中间 CA,而中间 CA 的合法性需要根 CA 来保证。

一般来讲,层级认证链的问题不大,只要能保证上一级的合法性,就能认为下一级也是合法的。问题就出在根 CA 上,我们凭什么无条件去相信它?如果根证书本身就是非法的,这个认证链不就没有意义了吗。

我的理解是, 没有绝对的安全,只有相对的安全。就像现实生活中,我们愿意相信各大银行的权威性,所以才把钱存放在里面。但我们不会把钱存进各种所谓的“地下钱庄”,因为他们没有官方背景,没有足够大的规模(可信样本不大)。再比如,当灾难发生时,我们愿意相信政府会真正帮助我们,因为有过很多先例,或者我们别无选择。往小一点的例子说,我们敢于打开 taobao.com 域名下的正常 url,敢于在淘宝上做交易,因为 taobao.com 是正规的电子商务网站,而且大家都在上面购物。我们会谨慎打开未知链接,也不会在未知网站上购物,因为未知网站没有足够多的安全先例,也没有证明自己有什么安全方面的能力。

我们之所以信任一个认证机构,不在于认证链本身,而是 基于多个可信情报源所做出的判断

所以说,没有绝对的安全,但是相对的安全还是有的。有些实体的安全度比较低,有些实体的安全度比较高。而层级认证链的作用正好是,负责可信度从低到高的递增。认证链本身不会产出可信度,但它能让可信度变得更高。

证书中心

常见的 CA 有著名的 VeriSign、Thawte、GeoTrust,全球 CA 认证服务市场的三巨头。
国内的情况:

  • 非区域性 CA:人民银行联合12家银行建立的金融CFCA安全认证中心、中国电信认证中心(CTCA)、海关认证中心(SCCA)、国家外贸部EDI建立的国富安CA安全认证中心等。
  • 区域性 CA:以广东电子商务认证中心为首的“网证通”认证体系、以 SHECA 为首的 UCA 协卡认证体系。

12306 的证书

下面要讲一下 12306 的证书问题。大家都知道,访问 www.12306.cn 时浏览器会报警如下:

密码学之数字证书及PKI体系 - 图3
点进去看看详细,如下:
密码学之数字证书及PKI体系 - 图4
密码学之数字证书及PKI体系 - 图5

12306 的证书 kyfw.12306.cn 是由一个叫做 SRCA 的 CA 颁发的,但是为啥浏览器报警说 “this certificate was signed by an untrusted issuer”呢, 原因是这个 SRCA 并不在浏览器或者操作系统的证书列表里!

所以呢,12306 官网上会要求大家购票前先下载安装证书:
密码学之数字证书及PKI体系 - 图6

这相当于人为的把 SRCA 安装到操作系统中。这么做到底安不安全,各位看官自己评判一下。总之,我个人对手动安装根证书到电脑里是表示担忧的。

常见攻击方式

虽然 PKI 是目前最成熟的解决方案,但还是存在一些缺陷。

冒领证书

比如说,攻击者 Mallory 向 CA Trent 说:“我是 Bob,给我注册一个 Bob 的证书吧”。如果 Trent 不对身份加以鉴别,则导致 Mallory 拥有了 Bob 的证书,用于进行中间人攻击。为了防止这种攻击,CA 一般会采取一套方法来确认注册者的身份,即 认证业务准则(Certificate Pratice Statement,CPS)。安全等级越高,身份认证就越严格。比如对于一些安全级别较高的场景,需要当面认证以及提供法律上的证明。

窃取 CA 的私钥

如果攻击者可以窃取到 CA 的私钥,那么他能以该 CA 的身份随意颁发证书,这是相当严重的事情。所以 CA 们都需要做的一件事情是,想方设法地保护自己的私钥。一旦私钥被窃取,需要立即通过 CRL(Certificate Revocation List)通知用户,哪些证书是要作废的。

CRL 就是一张 证书作废清单,上面包含的是已作废的证书序列号。PKI 用户在进行认证前,需要从 CA 获取最新的 CRL,并查询自己面对的证书是否已过期。这个步骤非常重要。

伪装 CA

攻击者 Mallory 伪装成一个 CA,并为自己伪造的公钥颁发证书,发送给被攻击者 Alice。Alice 收到证书后,用 CA (其实就是 Mallory)的公钥进行验证。肯定会验证成功,于是 Alice 相信这个公钥,并用它对数据进行加密。这就是典型的中间人攻击。

可见, 如果 CA 本身不合法,即使证书合法,其中的公钥也不可相信。想了想,类似 12306 那种情况真是有点细思恐极呢。