数字证书与安全

在前文《SSL/TLS协议》 中提到过, HTTPS 相比 HTTP 会多两步 SSL 的握手过程, 服务端会下发包含公钥的数字证书(Public Key Certificate). 本文中, 我们来再具体讨论一下证书.

1. 什么是证书 (Certificate) ?

百度百科中对数字证书的词条解释如下:

数字证书就是互联网通讯中标志通讯各方身份信息的一串数字, 提供了一种在Internet上验证通信实体身份的方式, 数字证书不是数字身份证, 而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名). 它是由权威机构 CA 机构, 又称为证书授权 (Certificate Authority) 中心发行的, 人们可以在网上用它来识别对方的身份.

简单点来说, 有这么几点:

  1. 数字证书可以看成一种签名, 例如 https://www.github.com 使用的 DigiCert 证书, 就代表了 github 的签名.
  2. 我们通过 Chrome 访问 github 时, Chrome 浏览器发现这个证书是由权威机构 DigiCert 背书的, 并且在有效期内, 就认为证书/签名可信, 导航栏会展示 "安全" 标记.
  3. 在浏览器和 Web 后台建立 HTTPS 连接时, 会利用证书里的公钥信息, 分别计算得到一份相同的 session key, 来做数据加密, 从而保证了通信安全.

数字证书一般包含以下信息:

  • 证书版本号 (Version)
  • 证书序列号 (Serial Number)
  • 签名算法标识符 (Signature Algorithm)
  • 签发机构名 (Issuer)
  • 有效期 (Validity)
  • 证书用户名 (Subject)
  • 证书持有者公开密钥信息 (Subject Public Key Info)
  • 扩展项 (extension)
  • 签发者唯一标识符 (Issuer Unique Identifier)
  • 证书持有者唯一标识符 (Subject Unique Identifier)
  • 签名算法 (Signature Algorithm)
  • 签名值 (Issuer Signature)

按照认证的级别, 数字证书还可以分为这三种:

  • DV, Domain Validation, 面向个人用户, 通过 whois 的邮箱验证, 例如 lets encrypt 提供的免费证书.
  • OV, Organization Validation, 面向企业用户, 验证除了邮箱之外, 还需要公司授权, 例如 百度 使用的 GlobalSign 证书.
  • EV, Extended Validation, 除了 OV 的要求外, 还要求企业提供金融机构的开户许可, 要求很高, 例如 Github 使用的证书.

有个SSL证书在线检测工具, 使用很方便.

2. 数字证书是从哪里来的?

上文讲到, 一般由权威机构(Certificate Authority, CA)签发, 授权给个人/企业用户使用.

在 Mac OS 下使用 Chrome, 打开 "设置" - "管理证书", 会打开 "钥匙串访问", 可以看到本机上所有的数字证书, 如下图:

3. 怎么判断数字证书是有效的?

正常来说, 操作系统或者浏览器会校验这些条件:

  • 颁发证书的 CA 是否在受信任的范围
  • 证书的有效期
  • 证书的使用者
  • CA 的公钥和证书的签名是否能匹配

例如, 我们通过 Chrome 访问 12306.cn 时, 通过 "开发者工具" - "Security" - "View Security" 可以看到证书的信息:

这个证书由 DigiCert SHA2 Secure Server CA 颁发给 *.12306.cn 使用, 有效期是 2017/11/29 - 2017/12/4.

切换到 "证书路径" 标签页:

DigiCert SHA2 Secure Server CA 持有的证书是 DigiCert Global Root CA 颁发的, 而 DigiCert Global Root CA 是受信任的根 CA, 自己给自己颁证书.

Chrome 再计算发现证书的签名和公钥信息能对的上, 上述的校验条件都满足, 所以, 给出了安全提示:

4. 怎么知道哪些是正规的 Root CA?

Wiki 中提到:

在密码学和计算机安全领域, 根证书 (root certificate) 是属于根证书颁发机构 (CA) 的公钥证书, 是在公开密钥基础建设中, 信任链的起点.

根证书没有上层机构再为其本身作数字签名, 所以都是自签证书. 许多应用软件 (例如操作系统、网页浏览器) 会预先安装可被信任的根证书, 这代表用户授权了应用软件代为审核哪些根证书机构属于可靠, 例如是公认可靠的政府机关 (如香港邮政) 、专职机构 (如 Google、Lets Encrypt、CAcert.org、Comodo、DigiCert、GlobalSign、Verisign) 等.

以微软的 Windows 7 操作系统为例, "运行" - "mmc" - "文件" - "添加或者删除管理单元" - "添加证书", 可以看到 Win7 默认内置的受信任 Root CA, 包括 DigiCert, GoeTrust, Go Daddy 等.

Root CA 自身的安全防护非常重要, 一旦外泄, 可能导致整个信任链被摧毁. 2011年, 荷兰 CA DigiNotar 的服务器被黑客入侵, 签发了数百张伪造证书, 事情曝光后各大厂商陆续将 DigiNotar 从受信任列表移除, 直接导致 DigiNotar 完蛋.

在信任链设计中, 绝大部分的根证书都不会直接为客户签名, 而是先签名一个 (或多个) 中继证书, 再由中继证书为客户签名, 这可以加强控管能力及控制一旦签名私钥被泄时的损失.

上面 12306 的例子中, DigiCert SHA2 Secure Server CA 所持有的就是一个中继证书.

5. 如果我要建个 HTTPS 网站, 必须要找 Root CA 购买证书么?

如果只是测试, 可以使用 OpenSSL 自建 CA 颁发证书, 因为不涉及对外, 直接导入到操作系统的可信任列表即可, 具体过程可以参考: 《细说 CA 和证书》

如果是对外服务, 也有免费的选择: 为了推广HTTPS协议, 电子前哨基金会EFF成立了 Lets Encrypt, 提供免费证书, 具体使用过程可以参考官方工具.

6. 证书还有哪些使用场景?

除了 HTTPS 建站之外, 还有这些:

  • 基于 HTTPS 的 RESTful API, 也要用到证书, 提供 HTTPS 服务.
  • ToB Web 应用, 在一些敏感操作场景下, 需要做 SSL 双向认证, 这时候要求客户端也拥有证书 (一般都是之前从网站上申请后下载安装的), 并和服务器交换证书.

延伸阅读