小型部署之所以转向指纹,是因为证书颁发机构看上去像没人有时间运维的基础设施。这种直觉是合理的,但人们转而选择的捷径——把一个数据通道密钥复制到两端——并不合理。peer-fingerprint 方案保留了 TLS 结构:每一端仍持有自己的私钥和证书,每一端仍验证对方。改变的是验证的锚点:从受信任的颁发者变成一小串固定摘要。由于摘要覆盖整张证书而非某个名称,续期就成了真正耗时的那项操作。

指纹究竟承诺了什么

证书指纹是对整张 DER 编码证书的摘要,而不是对其公钥、也不是对其主体名称的摘要。因此,名称相同、密钥相同但有效期不同的两张证书,指纹并不相同。这既让固定变得精确,也让续期变得麻烦。固定不可能意味着笼统地信任某个密钥,因为它指的是某个生命周期中某一时刻的单一产物。任何人都可以知道摘要,而知道摘要本身什么也证明不了。

openssl x509 -in server.crt -noout -fingerprint -sha256
openssl x509 -in client-07.crt -noout -fingerprint -sha256

持有对应私钥才能证明对端持有那张证书,而摘要决定了另一端如何判断它是否期待这张证书。正是这种分离,使该设计不同于旧的共享密钥做法:共享密钥认证的是任何知道同一串字节的人,而固定只认证一张证书。另一台设备得到的是自己的条目,而不是同一密钥的副本——在文件上差别很小,在影响范围上差别很大。

这张对应表是相互的,而非对称的

每个端点需要两样东西:自己的私钥与证书,以及一份关于接受哪些对端证书的声明。在客户端,这份声明是服务器证书的摘要;在服务器上,则是已登记客户端摘要的列表。Community 2.6 的官方小规模配置示例展示了配合 peer-fingerprint 的布置方式,在为真实部署选择这种信任模型之前值得一读。两个方向不是同一份清单的反转,它们出错的时间也不同。

Verification directionWhat is pinnedWhat never leaves that endpointHow a wrong pin shows up
Client checks the serverOne digest, for the server certificateThe server private keyThe client aborts during the TLS handshake
Server checks the clientA digest per enrolled clientEach client private keyThe server rejects the peer before a tunnel exists

添加设备只需编辑服务器上的白名单,既不必复制现有客户端的私有材料,也不必把服务器密钥搬到任何地方。两个方向也会各自独立失败,这在排查时很有用:先结束握手的一方,就是预期未被满足的一方。若客户端拒绝服务器,说明摘要与对方出示的证书不符。若服务器拒绝客户端,说明该客户端的摘要不在列表里,或者客户端出示的不是登记过的那张证书。

登记:新设备如何加入

在私钥将要存放的地方生成新设备的密钥和证书,然后只把公开产物交给需要固定它的那一端。通过你已信任的通道传递预期摘要,并比较整张证书,而不是一个看起来熟悉的名称。与证书来自同一次未经验证的下载的摘要,只能证明两个文件彼此一致。这是一致性检查,不是身份检查,也正是该设计最不易察觉的弱化方式。

在服务器上,添加摘要是走常规管理器的配置变更,随后会重新连接。确认新设备能连上,并确认删除了摘要的设备不再能连上。只覆盖正常情况的测试会让白名单处于未验证状态,而半年后你恰好就在这个状态里。

续期是最费钱的时刻

每张证书都会到期,即使密钥和名称保持不变,新证书也会带来新摘要。在颁发者模式下,续期对信任该颁发者的对端是透明的;在固定模式下,它是对每个固定该证书的对端都要执行的一次登记。

把顺序安排在到期日之前,而不是之后。把新摘要分发给验证它的一方,应用变更,然后才替换端点上的证书。这个顺序不会留下双方对哪张证书是现行的分歧窗口。白名单本身也要定期复核,因为固定清单会积累几个月前就已退役设备的条目。每条陈旧条目都是一个只要私钥还在就仍能通过认证的身份,所以删掉一条属于安全操作,而非日常清理。

信任映射不决定的部分

认证只是一层,固定的映射不涉及地址池、推送路由、路径 MTU 或防火墙策略。这些仍是各自独立的配置,有各自的故障方式。能通过认证却完全不转发流量的隧道,与从未建立的隧道是完全不同的排查对象。

映射也不会无限扩展,更大的部署最终会走向基于颁发者的 PKI。这种偏好关乎运维而非密码学:随着设备规模增长,通过单一权威增删身份,比在每个对端上编辑清单要便宜。当某个客户端实现不支持该选项时,答案是它能文档化的兼容信任模型,或有支持的替代方案。压掉验证警告并不会增加这种支持,而这个设计的全部价值就在于验证仍然发生。

相关文章