Windows 上 Easy-RSA 注册表错误:检查注册表视图
那条注册表提示是工具查找失败,而不是 CA 损坏。先比较 32 位和 64 位视图,再改批处理文件或 PKI。
批处理文件报出“系统找不到指定的注册表项或值”就停了,大家便认定证书颁发机构坏了。并非如此,至少现在还不是:脚本是在查找软件时失败的,还没让 Easy-RSA 拿密钥做任何事。这个先后顺序很关键,因为它说明修复属于查找问题,PKI 只是旁观者。读懂报错的那一行就是全部诊断,而且比任何绕过办法都省时间。
错误发生在接触 CA 之前
旧版 Easy-RSA 2 批处理文件通过查询注册表来定位 OpenSSL 或 OpenVPN 的安装位置,再用查到的结果设置变量。查询没有返回任何内容时,脚本在任何一个证书操作运行之前就中止了。
因此,关于注册表项的提示是脚本所处环境的证据,而不是 CA 目录的证据。
两个注册表视图,一个批处理文件
32 位进程与 64 位进程看到的注册表视图可能不同,只假定其中一种的批处理文件就会漏掉另一种里存在的项。下面这组只读对比展示了某些旧脚本所用旧项在两个视图中的差异:
reg query "HKLM\SOFTWARE\OpenVPN" /reg:32
reg query "HKLM\SOFTWARE\OpenVPN" /reg:64
Microsoft 的 reg query 参考文档 说明了视图选择器。请在失败脚本相同的上下文中分别执行这两条命令,因为视图既取决于进程如何启动,也取决于标志。如果该项只存在于一个视图中,先把它指向的路径与已安装工具比对,再动手修改。存在但指向旧安装目录的项,与完全不存在的项是两种不同的故障。
如果两个视图都没有这项,说明安装程序从未创建过它,手工编造一个值也不会让工具正常工作。
不要无条件添加 /reg:64
诱人的做法是给每个查询都加上 64 位选择器,然后继续。在某些安装上这是对的,在另一些上却会把脚本送到一个确实什么都没有的视图。
先看清哪个视图里有期望的值,再改动查询。
查找不等于修复 PKI
这个错误并不能证明 CA 证书、签名密钥、序列号文件或吊销数据库已经损坏。照旧教程跑一遍 clean-all,会毁掉完全另一组对象,而查找问题依然如故。在头脑里和在工单里都要把这两件事分开。如果之后某个证书操作失败,要按它自己的证据去判断。
在做任何试验之前备份 CA 目录,哪怕你确信那只是读取。
升级到 Easy-RSA 3 属于迁移
维护中的安装应当使用当前软件包自带的启动器和配置模型,而 Easy-RSA 3 并不是 Easy-RSA 2 那套批处理工作流。它的新 PKI 快速入门并不是针对现有颁发机构的迁移说明。更换版本之前,请保留 CA 材料以及签发和吊销记录,并遵循该版本的升级指引。为了让工具查找错误消失就在权威目录里初始化一个替代 CA,是清单上最糟糕的选项。
换版本是一个项目;注册表错误只是半个下午。
真正解决问题的对比
写下四件事并直接对比:
- 跑的是哪个脚本,失败的是哪一行。
- 那一行查询的是哪个注册表视图。
- 脚本期望的是哪个可执行文件路径。
- 机器上实际存在的是哪个安装。
当这四项对得上,错误就消失了;剩下任何证书问题,都可以按它自己的证据来读,而不是怪到 CA 头上。