只有密码的 OpenVPN 配置文件该放哪个 CA 文件?
CA 字段验证的是服务器,不是用户。先看配置文件已经带了什么,区分四类材料,再读下一条报错。
按顺序过完四个问题,CA 对话框就不再含糊。运营方实际签发了什么材料、配置文件已经包含什么、是哪个字段在提问、文件加载后会发生什么。在第一个无法用运营方自己的说明回答的问题上停下来,因为再往下猜,公开的 CA 证书就会和一把本不该离开服务器的私钥配在一起。
顺序很重要:后两个问题只有在你弄清应该存在什么材料之后才有意义。
从配置文件已经带了什么开始
用文本编辑器打开配置文件,先找 ca 块,再去找文件。内联 ca 块里装着运营方的公开 CA,说明配置文件是自足的;此时仍然索要 CA 文件的客户端可能在读另一个配置文件,或者导入不完整。如果配置文件里是一行指向路径的 ca,那么该路径在部分集成中是相对客户端工作目录的,在另一些集成中则是绝对路径。改任何东西之前,先记下自己属于哪种形式。
ca /absolute/path/operator-ca.crt auth-user-pass remote-cert-tls server
检查交付包里配置文件引用的文件:一份 CA 证书,有时还有单独的客户端证书和私钥,可能还有一个 tls-auth 或 tls-crypt 文件。引用四个文件却只到两个的配置文件是不完整的,再怎么指字段也补不回来。缺的部分应向运营方索取,而不是拿手边碰巧有的证书顶上。
区分四类材料
CA 证书是用来验证服务器身份的公开材料。客户端证书向服务器表明用户或设备的身份。私钥是那份客户端证书的保密一半,绝不能是 CA 的签名密钥,也不能是服务器密钥。tls-auth 或 tls-crypt 材料是另一份共享秘密,保护控制通道。这四类不能互换;把 CA 字段指向客户端证书,得到的验证失败看起来像信任问题。
只用密码认证改变的是你需要四类中的哪一类,而不是它们的含义。使用 auth-user-pass 与 remote-cert-tls server 时,客户端仍要拿 CA 验证服务器,所以即使没有客户端证书,CA 字段也会出现。是否还需要客户端证书由运营方的策略决定,任何对话框都告诉不了你。
把客户端指向信任文件
要选 CA 证书文件本身,不是包含它的文件夹,也不是装着客户端身份的 .p12 包。Windows 上路径写法和文件选择器的行为与多数教程里的 Linux 示例不同,所以用已安装客户端接受的方式,并确认运行它的账户能读该文件。权限问题和文件缺失在对话框里看起来一样,但产生的日志行不同。选完之后重新打开配置文件设置,确认客户端记住了选择。
<ca> -----BEGIN CERTIFICATE----- ...operator-provided public CA... -----END CERTIFICATE----- </ca>
如果客户端支持内联块,优先用运营方提供的内联配置文件,而不是手工拼装的那份。内联材料随配置文件一起走,重新导入也不会丢;绝对路径则在配置文件换到另一台机器的瞬间失效。
读下一条报错,而不是同一条
提供正确 CA 的目的,是让报错发生变化,而不是让它消失。CA 加载后出现服务器身份失败,说明证书与预期名称或 remote-cert-tls 预期不符,这与密码被拒是两种不同的修法。密码被拒意味着 TLS 层已经成功,而凭据是错的。留住第一条新消息,那才是有用的。
能连上却哪里都到不了的客户端,已经彻底越过了信任,眼下面对的是路由或 DNS 问题。
绝不要为了跳过那个对话框而关闭验证。接受任何证书的客户端没有理由索要 CA,而它建立的隧道也不是运营方想要的那条。