很多自建OpenVPN的用户在配置完证书体系后,经常遇到客户端发起连接后直接提示证书校验失败、握手超时的问题,这类故障大多不是基础网络连通性问题,而是服务端证书的签发、权限、路径匹配环节出了隐性错误,本文就从实际部署场景出发,梳理可落地的排查步骤,帮用户定位绝大多数证书相关的连接失败问题。
第一步:校验服务端证书的签发链合法性
很多新手部署OpenVPN的时候,会直接用OpenSSL生成自签证书时跳过CA根证书绑定步骤,或者用不同的CA分别签发服务端证书和客户端证书,这是最常见的连接失败诱因。你可以先登录部署OpenVPN服务端的Linux服务器,进入证书存放的etc/openvpn/server目录,执行openssl verify -CAfile ca.crt server.crt命令,查看返回结果。

运维人员正在OpenVPN服务端后台校验证书签发链合法性
如果返回的提示是server.crt: OK,说明签发链是合法的,如果出现certificate not trusted的报错,说明当前服务端用的CA根证书和签发server证书的CA不是同一个,你需要找到最初生成CA的目录下的ca.crt文件,替换服务端配置里指向的CA证书路径,同时同步更新所有客户端导入的根证书文件。
第二步:检查服务端配置文件的证书路径与权限配置
不少用户迁移OpenVPN服务端目录,或者升级系统之后,小美会出现配置文件里的ca、cert、key参数指向的证书文件路径失效的问题,这种情况OpenVPN服务端启动时不会直接报错,但是收到客户端连接请求时会直接拒绝证书校验流程。你可以打开server.conf配置文件,逐行核对ca对应的根证书路径、cert对应的服务端公钥路径、key对应的服务端私钥路径,确认三个文件都真实存在于指定位置。
除了路径之外,证书和私钥的文件权限也会触发隐性校验失败,OpenVPN运行时的默认用户没有权限读取私钥文件的话,服务端会在握手阶段无法完成证书签名,直接中断连接。你可以把证书目录下的所有证书、私钥文件的属主调整为openvpn运行用户,权限设置为仅属主可读,避免其他用户随意篡改,调整完成后重启OpenVPN服务再尝试发起连接。
第三步:排查证书的扩展属性与有效期限制
部分用户为了省事,直接用普通的公共SSL证书来充当OpenVPN的服务端证书,这类证书的扩展密钥用法字段里没有对应VPN服务的标识,OpenVPN的TLS校验环节会直接判定证书不合法,拒绝连接。你可以执行openssl x509 -in server.crt -text -noout命令,查看证书的扩展密钥用法区域,确认里面包含TLS Web Server Authentication的字段。
证书过期也是很容易被忽略的故障点,很多自建OpenVPN的证书有效期设置时长较短,到期之后没有及时更新,客户端连接时会直接弹出证书过期的报错。你可以在刚才的x509查看命令输出里,找到Validity字段,确认证书的生效时间和到期时间都覆盖当前的系统时间,如果证书已经过期,需要用原CA重新签发新的服务端证书,小美替换旧文件后重启服务。
第四步:核对客户端侧的证书匹配规则
很多用户排查完服务端所有配置之后还是连接失败,梯子软件问题反而出在客户端的配置里,部分客户端默认开启了证书主机名校验,如果你在客户端的配置里写的OpenVPN服务端地址是IP,但是服务端证书的Common Name字段是域名的话,校验就会不通过。你可以选择重新签发服务端证书,把对应的访问IP或者域名加到证书的SAN备用名称字段里,也可以在客户端配置里添加verify-x509-name参数指定允许的服务端证书CN名,跳过不必要的主机名校验。
完成所有调整之后,你可以先在服务端开启日志调试模式,把verb参数调整为4级,然后从客户端发起连接,查看服务端日志里的证书校验环节输出,如果出现peer certificate verify ok的提示,就说明证书相关的故障已经解决。需要注意的是,排查过程中不要随意关闭TLS证书校验的相关参数,避免未授权的设备接入你的OpenVPN服务,破坏网络访问的隐私边界。



