命令因缺少 ca.crt 或 index.txt 而停下,可 CA 已经签发证书好几个月了。权威本身没有任何变化;命令只是往别的地方看了。Easy-RSA 3 会从选项、环境变量、vars 文件和内置默认值中确定 PKI 目录,其中任何一个都可能指向部署所用权威之外的位置。在创建任何东西之前,先确认到底是哪一个生效。

报错说的是文件,不是目录

安装目录和签发者目录是两个不同的地方。在机器上找到easyrsa只能证明工具装了,不能证明它找到了你的 VPN 所信任的权威。

所以重装软件包或重跑 init 步骤看起来很有效,实际什么都没改变。

先检查选择器

在 Easy-RSA 3 中,选择器是EASYRSA_PKI或对应的--pki-dir选项。传入绝对路径,例如--pki-dir=/srv/pki/office,答案就不再取决于你碰巧站在哪个目录。这一个习惯能消掉一整类问题,对从 cron 或 CI 检出目录运行的脚本尤其重要。

先确认代数,因为 Easy-RSA 2 那种vars文件加build-key的习惯,与 Easy-RSA 3 期望的模型并不相同。easyrsa --version会先打印代数,./easyrsa --help会列出子命令:build-key目标是 2.x,而build-client-full表示 3.x。把旧的KEY_DIR路径带进 3.x 调用、只因为目录名看着眼熟,正好会产生这个错误。

如果版本字符串和命令语法对不上,就停下来读已安装版本的文档。

优先级解释了 vars 文件为何失效

文档写明的优先级是命令行选项、环境变量、vars 文件、内置默认值。因此vars里的正确值会输给继承来的环境变量,这就是这种故障的安静版本。检查目标变量和文件选择,而不是把整个环境倒进工单。两者之间的区别通常就是秘密。

按顺序走一遍这条链,记下命令实际用的路径来自哪个来源。知道这一点后,修正就是一个标志或一次 export,而不是新建一个证书颁发机构。

Easy-RSA配置参考定义了选择器和优先级,这才是应当写进工单的引用。

用公开材料确认签发者

对常见的基于文件的签发者,读取ca.crt,把它的指纹与你批准过的签发者记录比对。主体名相同不是身份证据,一个叫 production 的目录也不是。只有指纹能把找到的文件与你告知对端信任的权威绑在一起。

只读检查就够了:openssl x509 -in /srv/pki/office/ca.crt -noout -subject -issuer -serial -fingerprint -sha256。

然后确定这个目录的角色。客户端使用的请求目录不是签发者数据库,离线保存的签名密钥也不该出现在每台 VPN 主机上。缺少ca.key在这种布局中是设计使然,不是另造一个替代权威的许可。

如果状态真的没了

有时路径没错,状态确实不在。空的index.txt加上重启过的序列计数器,会给你一个看起来健康、却无法为它从未见过的证书作任何证明的 PKI:续期不会吊销旧证书,新编号还会与历史冲突。这时应当从 CA 已批准的备份恢复,因为在别处初始化一个空白 PKI 只是把错误挪走,还留下第二个毫不相干的权威。

路径和签发者一致之后,再按性质处理下一个故障。Permission denied、需要口令的签名密钥、缺失的签发记录是三种不同的问题,只有一个和你刚修好的目录有关。

绝不要为了掩盖路径错误而移除密钥加密或放宽目录权限。错误本身修起来很便宜,修复的代价不便宜。

相关文章