第4章:根CA与中间CA的密钥边界设计
上一章我们聊了密钥的生命周期,这一章要深入一个实战中特别容易出问题的环节——根CA和中间CA的密钥边界到底怎么划。说白了,就是谁管什么密钥,谁不能碰谁的密钥。
我记得第一次带团队搭建企业CA体系时,脑子里还是单层CA的思维,结果密钥混在一起用,差点出了安全事故。从那以后,我对边界设计就特别敏感。你想想看,根CA的密钥要是被中间CA拿到了,整个信任链就形同虚设。
为什么需要边界?
根CA和中间CA的角色不一样。根CA是信任锚点,它的私钥一旦泄露,整个PKI都得重建。中间CA是分发证书的主力,使用频率高,暴露风险大。这两个角色的密钥必须隔离开。
我见过一个项目,把根CA和中间CA的私钥存在同一个HSM里,仅仅用逻辑分区隔开。结果运维脚本写错了路径,中间CA的签名请求直接用根密钥签了,证书链里出现了不该有的交叉。嗯,这其实就是边界划分没做好。
安全边界设计的核心原则就一句话:最小权限。每个CA角色只拥有它完成本职工作所必需的密钥和操作权限。
核心边界原则:
- 根CA的私钥必须离线存储,物理隔离
- 中间CA的私钥可以在线使用,但必须使用HSM或专用加密机
- 根CA不能直接对最终实体证书签名,那是中间CA的活
- 中间CA的签发权限必须受证书策略约束,不能无限签发
两种CA的密钥设计差异
咱们先看一个常用的对比。我用表格来展示,这样更直观。
| 维度 | 根CA | 中间CA |
|---|---|---|
| 密钥长度 | 至少4096位RSA或ECC P-384 | 2048位RSA或ECC P-256即可 |
| 密钥算法 | 推荐使用ECDSA,签名更小、速度更快 | RSA或ECDSA均可,看应用场景 |
| 密钥复用 | 不能复用,每个根CA独享一套密钥 | 可以多个中间CA共享同一HSM |
| 存储介质 | 离线HSM、智能卡或纸质备份 | 在线HSM、服务器安全模块 |
| 使用频率 | 极低,可能几年用一次 | 日常签发,每天数千次 |
| 生命周期 | 10-20年,甚至更长 | 2-5年,到期更新 |
从这个表能看出来,根CA和中间CA的运维模式完全不同。根CA更像一个保险柜,中间CA像一把常用钥匙。你不能把保险柜的钥匙挂在腰上到处跑。
边界划分的具体做法
在实际部署中,我习惯按物理边界、逻辑边界、操作边界三层来划分。
物理边界
根CA的硬件必须放在独立的安全机房,甚至可以是断网的。我记得有个客户把根CA的HSM放在一个防火保险柜里,使用时要两个人同时到场。中间CA则部署在普通的数据中心,只需要一般的安全级别。
物理边界的核心是:根CA不能有网络连接。任何网络,包括管理网络,都不行。我曾经看到有人用串口线连到根CA服务器,以为这就安全了——其实串口线也属于物理连接,一旦那台管理机被攻破,根CA照样危险。
逻辑边界
如果实在无法做到完全物理隔离,至少要在逻辑上隔离。比如使用不同的HSM分区,每个分区有独立的访问控制策略。
逻辑边界包括:
- 证书策略隔离:根CA只能签发中间CA证书,中间CA只能签发终端实体证书
- 密钥用途隔离:根CA的密钥只用于自签名和签发中间CA,中间CA的密钥只用于签发终端证书
- 路径长度约束:中间CA证书必须设置pathLenConstraint,防止无限续签
实战技巧:在签发中间CA证书时,一定要加上pathLenConstraint:0,这意味着这个中间CA不能再签发下一级CA了。这能有效限制密钥扩散的范围。
操作边界
操作边界指的就是谁可以碰这些密钥。根CA的操作必须由至少两名管理员共同完成,也就是所谓的分权制衡。中间CA的操作可以下发给运维团队,但要记录所有操作日志。
操作边界的关键是:根CA的管理员和中间CA的管理员不能是同一批人。如果同一批人同时拥有两个角色的操作权限,那边界就形同虚设了。
安全警告:如果根CA管理员同时能登录中间CA的服务器,那根CA的私钥就相当于暴露在中间CA的威胁范围内。一定要在组织架构上分开这两个角色。
边界设计知识体系
下面这张图把本章的核心逻辑梳理出来了。你可以看作是密钥边界设计的顶层视图。
从这张图能看出来,根CA和中间CA之间只有一条签发链路,而且这条链路是需要双人操作的。一旦中间CA签发出去,根CA就不应该再参与任何后续的签发活动。
边界划分的常见陷阱
我团队里有个新人,曾经把根CA和中间CA部署在同一台物理服务器的不同虚拟机上,还做了防火墙规则隔离。表面上看着很完美,结果一台虚拟机被攻破后,攻击者通过虚拟机逃逸拿到了另一台虚拟机的HSM访问权限。嗯,这就是物理边界没做死的教训。
另外一些常见陷阱包括:
- 根CA私钥在线备份:有人把根CA私钥加密后放在公司NAS上,NAS连了办公网——等于私钥在网络上裸奔
- 中间CA使用相同密钥结构:为了省事,直接用跟根CA一样的密钥算法和长度,反而增加攻击面
- 忽略证书策略约束:签发中间CA时不加pathLenConstraint,结果中间CA又能签中间CA,无限递归下去
我曾经排查过一个诡异的问题:一个中间CA签发的证书突然被客户端拒绝。查了半天发现,是运维人员用根CA的私钥重新签名了中间CA证书,导致证书链里出现时间戳矛盾。从那以后,我要求所有中间CA更新操作必须走正式流程,绝不能直接动根CA。
边界设计检查清单
最后,给出一份我在项目中实际使用的检查清单,你可以对照着看看自己的CA体系是否达标。
| 检查项 | 达标标准 | 常见失败案例 |
|---|---|---|
| 物理隔离 | 根CA无任何网络接口,包括管理网 | 根CA服务器连了带外管理口 |
| 密钥存储 | 根密钥离线存储于HSM或智能卡 | 根密钥存在服务器文件系统里 |
| 操作权限 | 根CA需双人操作,中间CA单人可控但记录日志 | 根CA的管理员也管中间CA |
| 证书策略 | 中间CA证书设置了合理的pathLenConstraint | pathLenConstraint不设或设得太大 |
| 密钥更新 | 根密钥更新频率不超过10年,中间密钥不超过5年 | 用同一个根密钥跑了15年 |
| 备份安全 | 根密钥备份使用物理介质,离线存放 | 根密钥备份存到了云端 |
检查清单的意义在于,让你在做边界设计时有明确的标准。不要凭感觉来,每条都有明确的判定依据。