数字证书中的密钥角色划分
这一章我们来聊聊证书里的“密钥是谁的”。很多人在刚开始配置PKI时,容易把密钥的用途搞混。我个人习惯是先画一张角色图,再动手。
为什么区分这么重要?你想想看,一个密钥如果既用来签名,又用来加密,一旦泄露,所有安全防线全崩。我在项目中遇到过一家公司,直接把服务器密钥当CA密钥用,结果被人拿到私钥后,整个内网证书链都废了。
1. 密钥对的基本概念
每个数字证书背后都有一对密钥:私钥自己留着,公钥放进证书。但“自己”是谁?这就引出了不同的角色。
- CA密钥:证书颁发机构手里的密钥,用来签发其他证书。
- 终端实体密钥:服务器、客户端、用户手里的密钥,用来证明身份或加密通信。
说白了,CA是“发证机关”,终端实体是“持证者”。两个人用的密钥,安全等级完全不同。
2. CA密钥与终端实体密钥的对比
这里我整理了一个表格,方便你对照理解。记得有一次客户问我:“为什么CA的私钥必须离线保存?”答案就在下面。
| 维度 | CA密钥 | 终端实体密钥 |
|---|---|---|
| 用途 | 签发证书、签发CRL/OCSP响应 | 数字签名、身份认证、加密 |
| 保护级别 | 最高(HSM+离线存储+多人授权) | 中高(HSM或TEE,部分场景允许软件证书) |
| 生命周期 | 10-25年(极长) | 1-3年(较短) |
| 泄露影响 | 整条信任链崩塌 | 仅影响单个实体 |
3. 密钥用途的边界划分
即使都是终端实体证书,签名和加密也要分开。为什么?因为签名需要抗抵赖,加密需要可恢复。
- 签名密钥对:私钥只用来签名,公钥用来验签。私钥只有用户自己持有,无法被恢复。
- 加密密钥对:公钥用来加密,私钥用来解密。私钥可能需要备份或托管,以防丢失数据。
我在项目里见过最典型的错误:用同一对密钥做SSL握手和代码签名。结果代码签名私钥泄露后,攻击者直接伪装成合法软件更新。嗯,从那以后我强制要求所有实体必须申请两本证书——一本签名用,一本加密用。
4. 实际部署中的案例
拿Web服务器举例。你给Nginx配的通常是TLS证书,这里边只有一对密钥:服务器签名密钥(用于TLS握手中的数字签名)和服务器加密密钥(用于会话密钥协商)。但注意,很多现代协议(如TLS 1.3)只使用签名密钥,加密密钥实际上是通过DH/ECDHE临时生成的。
另一类常见场景是代码签名。一个公司内部的开发团队,每个人的代码签名证书必须使用独立的签名密钥。我曾经帮一家金融科技公司做过审计,发现他们所有开发者共享一个代码签名密钥——这等于把公司的数字声誉装在一个人口袋里,太危险了。
5. 关键注意事项
- 根CA密钥:离线,物理隔离,多人控制。
- 中间CA密钥:在线,但存储在HSM中,只允许特定服务调用。
- 终端实体签名密钥:用户本地生成或由CA通过密钥托管(需要认真评估合规性)。
- 终端实体加密密钥:可以托管给KMS或HSM,方便恢复。
我曾在一次内部培训时被问到:“如果我把所有密钥都放在同一个HSM里,问题不大吧?”我的回答是:表面上看物理安全够了,但逻辑隔离不够。不同角色的密钥即使放在同一HSM里,也要通过不同的密钥ID、不同的访问控制策略、不同的审计日志来隔离。这才是真正的边界划分。