为什么两张 OpenVPN 证书可以共用一个 CCD 策略
序列号不是 VPN 用户名。在下一次签发之前,把服务器实际映射的通用名在每个受信任的 CA 中都预留出来。
一个 CA 可以签发两张证书,它们拿到相同的 OpenVPN 客户端专用配置,而两张证书里都没有任何东西提醒任何人。序列号不同,密钥不同,一旦组织单位改变,完整主题也不同。服务器只通过一个名字决定每个客户端的策略,而这个名字才是唯一必须唯一的东西。
服务器解析的是名字,不是序列号
在普通的证书查找中,服务器从出示的证书里取出通用名,再去寻找同名的 client-config-dir 条目。序列号从不进入查找。两张除通用名之外每个字段都不同的证书会落到同一个文件上,于是第二条连接继承了第一台设备的固定地址和下发的路由。
CA 一侧的唯一性检查就是这样通过的,而 VPN 依然会撞车。两项检查回答的是不同的问题。
在签发任何东西之前,先决定有效名应该是什么,并把它记在所属设备或账户旁边。一份包含名字、所有者、用途和证书指纹的登记表能覆盖大多数部署。没有它,证书档案就是哪个名字属于哪台设备的唯一记录,而这份档案无法区分一次获准的替换和一台冒用现有名字的第二台设备。在注册时就预留名字;如果两名操作员可能同时签发,就要加锁。
映射实际使用的是哪个名字
普通证书查找使用通用名。被配置为映射已认证用户名的服务器则改用那个值,这使证书的通用名与策略选择无关。读一下正在运行的配置,确认生效的是哪种映射。
两种映射可以同时存在,这时结果取决于服务器解析它们的顺序。回退到通用名的用户名映射会悄悄接受一张登记表从未批准过的证书。把有效名写在产生它的命令旁边,下一位操作员就不必重新摸索顺序。每种映射各测一条连接成本很低,也能把问题定下来。
映射产出什么,就该预留什么。在 CA 里预留通用名、而服务器却以用户名为准,预留的就是错的东西。
两个 CA 可以批准同一个名字
一个 VPN 服务可以信任不止一个签发机构,每个机构对哪些名字已被占用有自己的判断。两个互不相关的 CA 可以各自为不同设备批准同一个通用名,服务器会毫无怨言地接受两张证书。要把信任包里的每个机构都盘点一遍,而不只是你平常签发的那一个。故障会在第二家机构的证书第一次被使用时出现。
同样的道理适用于强制完整主题唯一、而不是通用名唯一的 CA。
两张共享通用名、但组织单位不同的证书主题不同,于是 CA 报告没有冲突,而服务器看到的是同一个名字。要检查你的签发工具实际使用的设置,而不是假定默认值。openssl ca 文档里对 unique_subject 的处理 就是那里相关的开关,围绕这个工具的封装通常会把它暴露出来,而不是替换掉。
续期是有预留的复用,而不是冲突
保留名字的续期是有意复用,登记表应当用平实的语言写明。把旧指纹和新指纹记在同一个名字下,审核者才能分辨替换和接管。服务器的 duplicate-cn 选项与此无关:它管的是并发会话,不是注册或名字预留。要决定两张凭据可以共存多久,以及旧的那张何时不再被接受。
交出替换品之前,先回读证书里实际有什么。主题行才是服务器要映射的字段,文件名暗示什么都不算。
openssl x509 -in device42.crt -noout -subject -serial -issuer吊销通常按签发者来标识证书,所以让一个序列号退役不会影响同一机构正确签发的替换品。这正是干净续期需要的性质,也是吊销无法清理两台设备共用名字的原因。在用户看到设备之前,先在测试连接上验证有效的策略名和分配的地址。然后有意识地让旧凭据退役,并把它记下来。