数字证书理解

数字证书的作用、组成和验证过程

问题

谈谈对数字证书的理解。

解答

什么是数字证书

数字证书是由权威机构(CA,Certificate Authority)颁发的电子文件,用于证明某个公钥属于某个实体(网站、组织或个人)。

类比:数字证书就像网络世界的”身份证”,CA 就是”公安局”。

为什么需要数字证书

解决公钥传输中的信任问题。假设没有证书:

1. 客户端请求服务器公钥
2. 中间人拦截,返回自己的公钥
3. 客户端用中间人公钥加密数据
4. 中间人解密获取数据(中间人攻击)

有了数字证书,客户端可以验证公钥确实属于目标服务器。

数字证书的组成

┌─────────────────────────────────────┐
│           数字证书                   │
├─────────────────────────────────────┤
│  版本号 (Version)                    │
│  序列号 (Serial Number)              │
│  签名算法 (Signature Algorithm)      │
│  颁发者 (Issuer) - CA 信息           │
│  有效期 (Validity)                   │
│    - 生效时间                        │
│    - 过期时间                        │
│  持有者 (Subject) - 网站/组织信息     │
│  公钥信息 (Public Key)               │
│  扩展信息 (Extensions)               │
├─────────────────────────────────────┤
│  CA 的数字签名                       │
└─────────────────────────────────────┘

证书验证过程

浏览器验证证书的步骤:

1. 检查证书是否过期
2. 检查证书颁发者(CA)是否可信
3. 用 CA 的公钥验证证书签名
4. 检查证书域名是否匹配当前访问的域名

证书链

实际中存在多级证书结构:

根证书 (Root CA)

    └── 中间证书 (Intermediate CA)

            └── 服务器证书 (End-entity Certificate)

验证时逐级向上验证,直到找到浏览器内置的根证书。

在 HTTPS 中的应用

┌────────┐                      ┌────────┐
│ 客户端  │                      │ 服务器  │
└───┬────┘                      └───┬────┘
    │                               │
    │  1. 请求建立 HTTPS 连接        │
    │──────────────────────────────>│
    │                               │
    │  2. 返回数字证书               │
    │<──────────────────────────────│
    │                               │
    │  3. 验证证书                   │
    │  4. 用证书中的公钥加密对称密钥   │
    │──────────────────────────────>│
    │                               │
    │  5. 双方使用对称密钥加密通信    │
    │<─────────────────────────────>│

查看证书信息(Node.js)

const https = require('https');

// 获取网站证书信息
const options = {
  hostname: 'www.google.com',
  port: 443,
  method: 'GET'
};

const req = https.request(options, (res) => {
  const cert = res.socket.getPeerCertificate();
  
  console.log('持有者:', cert.subject.CN);
  console.log('颁发者:', cert.issuer.CN);
  console.log('有效期:', cert.valid_from, '-', cert.valid_to);
  console.log('序列号:', cert.serialNumber);
});

req.end();

关键点

  • 数字证书由 CA 颁发,用于证明公钥的归属,防止中间人攻击
  • 证书包含:公钥、持有者信息、颁发者信息、有效期、CA 签名
  • 浏览器通过证书链逐级验证,根证书内置在浏览器/操作系统中
  • HTTPS 握手时,服务器发送证书,客户端验证后用公钥加密对称密钥
  • 证书验证包括:有效期、CA 可信度、签名正确性、域名匹配