数字证书理解
数字证书的作用、组成和验证过程
问题
谈谈对数字证书的理解。
解答
什么是数字证书
数字证书是由权威机构(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 可信度、签名正确性、域名匹配
目录