在没有根密钥的情况下委派 VPN 证书签发
签发证书是一种许可;持有根密钥是一种能力。中间证书限制前者,而删除账号并不等于入侵。
让某人有能力注册 VPN 客户端,和把根密钥的可携带副本交给他,是两件不同的事,差别只有在那样的人离开或那把密钥泄露时才会显现。前者在你能控制的工作流内授予一次操作;后者授予在任何地方、离线、无限期地制造信任的能力。在触碰任何密钥材料之前,先决定工作需要哪一样。层级图不会替你回答这个问题。
把注册工作写成三个问题:谁能提出请求,谁批准,以及签发组件能对什么签名。
决定你要授予哪种能力
签发服务可以公开审批流程,同时把签名材料留在另一个所有者手里。操作员批准设备请求,服务套用策略并记录签发,参与其中的人都不持有 CA 密钥。记录被允许的身份、审批人,以及服务可以签名的范围;然后像保护密钥一样谨慎地保护它的管理入口。证书签名请求是请求,不是授权决定。
硬件支持的存储改变的是 密钥被复制风险,而不是是否需要授权。不可导出意味着密钥取不出来,并不意味着任何能调用签名接口的人都有权拿到证书。要分别评估这两项属性。
中间证书限制权限
根可以为一本中间证书做认证,用于日常签发,于是例行工作不再触碰根密钥,前提是根自己的签名与恢复流程仍受保护。这是一道真实的边界,而且不免费:多一本证书、多一把密钥、多一次续期,还有一份要维护的吊销列表。当它代表有意设定的管理或风险边界时才使用它。为每个管理员各建一个签发者,会让一切变多,却买不到工作流本来没有给出的任何东西。
确认 VPN 校验方按你的预期构建链。把中间证书发给对方用于建链,与把它当作直接受信任的锚点安装,是两种不同的安排。
pathLen 零并不是你以为的意思
RFC 5280 第 4.2.1.9 节定义了基本约束,其路径长度字段限制一条有效路径上能跟随多少个非自签发的中间证书。零值限制的是更深的中间层,并不限制末端实体证书的数量。人们把它读成允许零本证书,然后纳闷签发为什么还能工作。把这个字段读成对 CA 的深度限制,行为就变得可预测。
同一节还表明,信任锚是路径校验的输入,而不是路径中的普通证书。正因如此,为自签发根发布吊销条目,并不能可靠地把它从每个存储中移除。
离职不是密钥入侵
当离开的人只有一个个人管理账号时,通过受支持的身份流程吊销那份访问权限及其会话,然后复查他创造的活动与审批。此前签发的客户端证书不会因为审批人离开而失效,把它们当作已被入侵,会造成一场规模巨大且没有必要的重新注册。停用账号也无法让已复制的签名密钥失效,所以应对方式取决于曾持有的是哪种能力。
中间证书被入侵时,必须撤销它的授权,并替换它担保过的每一个身份,按照校验方执行的策略来做。根的信任需要自己的应对,因为锚点生活在你可能无法掌控的信任存储里。
用四个具体情形来验收设计:合格设备完成注册,未获批准的请求被拒绝,被移除的操作员不能再签发,退役的签发者不再授予访问。这四个结果就是操作手册。