1. 证书基础概念:数字证书、X.509标准与信任模型
各位好,我是老张。做安全运维十几年了,跟证书打了太多交道。今天咱们聊聊最基础的东西——数字证书到底是什么。
说白了,数字证书就是网络世界里的身份证。你想想看,在现实世界里,我们靠身份证、护照来证明“我是我”。那在互联网上,两台机器要通信,怎么确认对方的身份?靠的就是数字证书。
1.1 什么是数字证书
数字证书,本质上是一个电子文件。它把一个实体的身份信息和一把公钥绑定在一起。这个实体可以是人、服务器、设备,甚至是一个代码签名。
我习惯把数字证书比作一个防伪信封。里面装着:
- 持有者的身份信息(比如域名、公司名、组织名)
- 持有者的公钥
- 证书的有效期
- 颁发者的签名
这个签名是关键。它保证了你拿到的证书没有被篡改过。我在项目中遇到过好几次,有人直接复制粘贴证书内容,结果因为格式不对导致握手失败。嗯,证书不是随便写写就行的。
核心要点:数字证书 = 身份信息 + 公钥 + 权威机构的数字签名。缺一不可。
1.2 X.509 标准
聊证书,绕不开 X.509。这是国际电信联盟(ITU-T)制定的公钥证书格式标准。目前主流的是 X.509 v3 版本。
X.509 规定了证书里该有哪些字段,每个字段长什么样。我刚开始接触时,觉得这东西很抽象。后来自己用 OpenSSL 解析过几次证书,就全明白了。
一个典型的 X.509 v3 证书结构如下:
| 字段 | 说明 | 个人备注 |
|---|---|---|
| Version | 版本号,目前通常是 v3 | 别用 v1/v2,太老了 |
| Serial Number | 证书序列号,由CA分配,唯一标识 | 吊销时靠它查 |
| Signature Algorithm | 签名算法,如 SHA256-RSA | 别再用 SHA1 了 |
| Issuer | 颁发者,即CA的名称 | 根证书的 Issuer 和 Subject 一样 |
| Validity | 有效期(Not Before / Not After) | 我吃过过期证书的亏 |
| Subject | 证书持有者信息 | 服务器证书看 CN 或 SAN |
| Public Key Info | 公钥算法和公钥值 | RSA 2048 起步 |
| Extensions (v3) | 扩展字段,如 SAN、Key Usage | 现代浏览器强制检查 SAN |
你可以用 OpenSSL 看一眼证书长什么样:
openssl x509 -in example.crt -text -noout
输出里会列出上面所有字段。我建议你亲手试一次,比看十篇文章都管用。
小技巧:X.509 v3 的扩展字段里,Subject Alternative Name (SAN) 现在几乎是必填的。从 Chrome 58 开始,浏览器只认 SAN,不认 Common Name 了。迁移证书时别忘了检查这个。
1.3 证书链与信任模型
单张证书没法自证清白。你想想看,如果 A 拿出一张证书说“我是 A”,你怎么知道这张证书是真的?你需要一个可信的第三方来担保。
这就引出了证书链的概念。证书链是一条从终端实体证书到根证书的信任路径。中间可能经过一到多个中间CA证书。
我画了一张图,帮你理解证书链的结构:
信任模型主要有三种。我分别说说:
1.3.1 层次信任模型(PKI层次结构)
这是最常见的。一个根CA签发多个中间CA,中间CA再签发终端证书。整个结构像一棵倒挂的树。浏览器和操作系统里预置了上百个根证书,这就是你的信任锚点。
我曾经帮一家金融客户排查过问题——他们的内部应用只信任自己的根CA,结果访问外部HTTPS接口全部报错。原因就是没把公共根证书加到信任库。嗯,这个坑很多人踩过。
1.3.2 网状信任模型
多个CA之间互相交叉认证。A信任B,B信任C,那A也间接信任C。这种模型在PGP(Pretty Good Privacy)里用得比较多。企业级PKI很少用,因为管理太复杂了。
1.3.3 桥接信任模型
用一个桥CA来连接多个独立的PKI体系。不同企业的CA不需要直接交叉认证,只要都信任桥CA就行。我在做政务系统对接时遇到过这种场景——不同部门各自有CA,通过一个桥接中心实现互信。
注意:证书链验证时,每一级证书的签名都必须合法,且没有过期或被吊销。我曾经遇到过一个案例:中间CA证书已经过期了,但终端证书还在有效期内。结果所有客户端都报错“证书链不完整”。你想想看,中间CA都过期了,它签发的证书自然也就失效了。
1.4 信任模型的验证流程
客户端(比如浏览器)验证证书时,大致走这几步:
- 拆解证书链:从服务器证书开始,逐级提取颁发者信息
- 逐级验证签名:用上一级证书的公钥,验证下一级证书的签名
- 检查有效期:每一级证书都不能过期
- 检查吊销状态:通过CRL或OCSP确认证书未被吊销
- 匹配信任锚:链顶端的证书必须在本地信任库中
这五步,一步都不能少。我见过有人为了省事,跳过了吊销检查。结果呢?被攻击者用已吊销的证书蒙混过关。安全这东西,偷懒不得。
避坑指南:我曾经在排查一个TLS握手失败的问题时,发现服务器只发了终端证书,没发中间CA证书。客户端本地又没有这个中间CA,导致链无法构建。解决方案很简单——在服务器配置里把完整的证书链(终端证书 + 中间CA证书)配上去就行了。
1.5 小结
这一章我们聊了三个核心概念:
- 数字证书:网络身份证,绑定身份和公钥
- X.509标准:定义了证书长什么样,v3版本是主流
- 证书链与信任模型:从根CA到终端证书的信任传递路径