在安装说明的某个地方,整个目录被原样复制到每台笔记本电脑上,因为这样比逐一判断哪些文件该留在那里更省事。这个目录里有 ca.key,而它一旦到达第二台设备,证书颁发机构就不再是机构了。如今任何持有者都能签发出整个网络都会信任的身份。

这层混淆值得一次性理清,因为这两个文件外形相似,作用却相反。

验证材料与签名材料

客户端需要 CA 的公开证书,用来验证对端出示的证书确实由该机构签署。这是验证工作,完全不需要任何秘密。给对端证书签名是另一件事,由运行 CA 的人执行一次,用的是永不离开受保护存储的私钥。把这两件事分开,正是分发两个文件的全部意义。

所以 ca.crt 属于配置文件,而 ca.key 不该出现在它附近的任何地方。文件名只是约定,不是保证,因此必须检查对象类型,而不能从名字推断。

采用中间 CA 或在线签发服务的架构也不例外。这是把签名能力挡在端点之外、同时又能规模化签发设备证书的标准做法。

客户端必须用自己的密钥证明什么

每台设备得到自己的密钥对和自己的证书,由 CA 签署一次。客户端出示该证书并证明自己持有配对的私钥,服务器再决定是否接受。笔记本丢失时被吊销的,正是这个身份。

这种差别在失窃之后最关键。有了按设备划分的身份,一台暴露的客户端只需吊销或移除对端就能下线,其余设备照常运行。

泄露的机构密钥不能这样处理。它签发过或本可签发的每一张证书都变得可疑,所以应对方式是替换整个信任体系,而不是单次吊销。那是一个项目,不是一张工单。

FileRoleBelongs on
ca.crtPublic certificate used to verify signaturesEvery client profile
ca.keyPrivate key that issues certificatesProtected CA storage only
client key pairProves one device's identityThat device alone

把文件复制到任何地方之前先读一遍

两条命令能在不打印任何秘密的情况下告诉你手里拿的是哪类对象。第一条显示证书上的主体和 CA 标志;第二条校验密钥并报出它的类型。对即将分发的包里的文件把两条都跑一遍。凡是校验通过为私钥的东西,都不属于客户端目录。

openssl x509 -in ca.crt -noout -subject -ext basicConstraints
openssl pkey -in ca.key -noout -check

如果第二条命令在客户端包里的某个文件上成功,就停下来,把该包视为已被攻破。输出说某把密钥有效,也就等于说它确实在场,而在场本身就是全部问题。

也要注意相反的方向:客户端配置里合法地含有该客户端自己的私钥。见到密钥就删,会切断连接却毫无改善,所以必须先弄清楚对象是什么,再决定移除。

控制已经分发出的密钥

不要以为删掉本地副本就撤销了暴露。任何持有过该文件的人都可能复制过,安全的假设是他们已经复制了。按运营方的事件流程走,更换信任锚,并在新 CA 下重新签发设备证书。

然后改掉制造问题的打包方式。发送目录清单时附上明确的文件允许列表,把 CA 密钥放在一台永不加入客户端机群的机器上,并记录由哪个系统保管。

如果机构必须频繁签发,就把签名移到作用范围窄、有效期短的服务或中间机构之后。这样将来出错时暴露的只是签发能力的一个子集,而不是整套部署的信任根。

相关文章