没有 CA 的 OpenVPN:peer-fingerprint 如何验证对端
指纹固定的是单一证书,而不是共享密钥。梳理摘要覆盖的范围、双方各自如何建立白名单,以及续期要付出什么代价。
小型部署之所以转向指纹,是因为证书颁发机构看上去像没人有时间运维的基础设施。这种直觉是合理的,但人们转而选择的捷径——把一个数据通道密钥复制到两端——并不合理。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 direction | What is pinned | What never leaves that endpoint | How a wrong pin shows up |
|---|---|---|---|
| Client checks the server | One digest, for the server certificate | The server private key | The client aborts during the TLS handshake |
| Server checks the client | A digest per enrolled client | Each client private key | The server rejects the peer before a tunnel exists |
添加设备只需编辑服务器上的白名单,既不必复制现有客户端的私有材料,也不必把服务器密钥搬到任何地方。两个方向也会各自独立失败,这在排查时很有用:先结束握手的一方,就是预期未被满足的一方。若客户端拒绝服务器,说明摘要与对方出示的证书不符。若服务器拒绝客户端,说明该客户端的摘要不在列表里,或者客户端出示的不是登记过的那张证书。
登记:新设备如何加入
在私钥将要存放的地方生成新设备的密钥和证书,然后只把公开产物交给需要固定它的那一端。通过你已信任的通道传递预期摘要,并比较整张证书,而不是一个看起来熟悉的名称。与证书来自同一次未经验证的下载的摘要,只能证明两个文件彼此一致。这是一致性检查,不是身份检查,也正是该设计最不易察觉的弱化方式。
在服务器上,添加摘要是走常规管理器的配置变更,随后会重新连接。确认新设备能连上,并确认删除了摘要的设备不再能连上。只覆盖正常情况的测试会让白名单处于未验证状态,而半年后你恰好就在这个状态里。
续期是最费钱的时刻
每张证书都会到期,即使密钥和名称保持不变,新证书也会带来新摘要。在颁发者模式下,续期对信任该颁发者的对端是透明的;在固定模式下,它是对每个固定该证书的对端都要执行的一次登记。
把顺序安排在到期日之前,而不是之后。把新摘要分发给验证它的一方,应用变更,然后才替换端点上的证书。这个顺序不会留下双方对哪张证书是现行的分歧窗口。白名单本身也要定期复核,因为固定清单会积累几个月前就已退役设备的条目。每条陈旧条目都是一个只要私钥还在就仍能通过认证的身份,所以删掉一条属于安全操作,而非日常清理。
信任映射不决定的部分
认证只是一层,固定的映射不涉及地址池、推送路由、路径 MTU 或防火墙策略。这些仍是各自独立的配置,有各自的故障方式。能通过认证却完全不转发流量的隧道,与从未建立的隧道是完全不同的排查对象。
映射也不会无限扩展,更大的部署最终会走向基于颁发者的 PKI。这种偏好关乎运维而非密码学:随着设备规模增长,通过单一权威增删身份,比在每个对端上编辑清单要便宜。当某个客户端实现不支持该选项时,答案是它能文档化的兼容信任模型,或有支持的替代方案。压掉验证警告并不会增加这种支持,而这个设计的全部价值就在于验证仍然发生。