systemd 服务能连接代理,却读不到 CA 文件
代理证书设置只在交互式 shell 中生效时,检查服务用户的文件权限和 systemd 文件系统限制。
获认可的 CA 证书包已经安装,终端里的请求也正常,服务却仍报证书加载错误。更换代理 IP 前,先看这个进程能不能打开同一份文件。
服务可能以另一个 Unix 用户运行,从不同目录启动,或者只能看到受限的文件系统。对你的登录会话有效的路径,不一定对它也有效。
先使用绝对路径
检查实际客户端中配置的路径。以 curl 为例,--cacert 选择目标站点的 CA 证书包;HTTPS 代理有独立的代理 CA 选项。其他客户端使用自己的配置键或环境变量。
文件本身和沿途目录都要检查:
namei -l /home/alex/certs/approved-ca.pem
systemctl show example.service -p User -p Group -p ProtectHome -p RootDirectory
这些是诊断示例,并不是让你把文件改成所有人可写。除了最终文件的读取权限,沿途目录的穿越权限同样重要。
问题可能不止文件权限
设置 ProtectHome=yes 时,systemd 会让该服务无法访问标准的 home 目录位置。修改证书文件的权限位,并不能解除这个命名空间限制。配置的根目录也可能改变服务内部绝对路径所指向的位置。
把文件放在适合服务配置的位置,例如 /etc 下专供该应用使用的目录,只授予必要的读取权限。把客户端的 CA 路径更新到新位置。不要仅因为最初那份文件放在个人 home 目录,就移除无关的文件系统限制。
先读有用的错误信息
“无法加载 CA 文件”和“证书链不受信任”是不同故障。前者可能在客户端还没开始验证时就发生。后者可能意味着证书包虽可读,但包含了错误的证书机构,或被用到了错误的 TLS 连接上。
修正访问权限后,从服务的运行环境重新测试。终端命令成功仍是有用的对照,但它不能证明服务看到了哪些文件,也不能证明其客户端实际采用了哪套信任配置。