不少运维人员在日常运维OpenVPN服务的过程中,经常遇到客户端发起连接请求后直接被拒绝的问题,反复排查防火墙规则、端口映射、路由转发配置都找不到异常,最后才发现根因出在服务端证书环节。本文围绕OpenVPN服务端证书连接失败排查的全流程展开,从故障现象识别到逐项校验的实操步骤,帮大家快速缩小故障范围,避免在无关的网络侧环节浪费过多排查时间。
第一步:确认故障属于证书类异常范畴
首先要先把证书类连接失败和普通网络连通性故障做区分,普通的端口拦截、路由不通故障,OpenVPN客户端的日志会明确提示连接超时,而证书类异常的典型特征是客户端日志直接抛出TLS握手失败、证书校验不通过的相关提示,很多新手会误把这类提示当成服务端端口未开放,反复调整防火墙规则做无效操作。
你可以分别在服务端和客户端侧用tcpdump工具监听OpenVPN的服务端口,如果能清晰看到客户端发过来的TLS Client Hello报文,但是服务端直接返回RST包拒绝连接,就可以基本排除三层网络连通性问题,直接把排查范围缩小到证书相关的TLS配置环节。
检查服务端证书的有效期与签发链合法性
登录OpenVPN服务端的证书默认存放目录,通常是/etc/openvpn/server路径下,找到服务端证书文件,用openssl x509命令查看证书的生效和过期时间,很多运维人员部署服务后长期未跟进证书状态,证书到期后完全忘记续期,就会直接导致所有客户端连接全部失败。
这里有个很常见的误区,不少人签发服务端证书的时候,没有把完整的根CA签发链导入到OpenVPN服务端的配置目录,或者签发服务端证书的根CA,和客户端本地导入的可信根CA不是同一个文件,哪怕两个证书的有效期都完全正常,TLS握手阶段也会直接校验失败,客户端会提示无法识别服务端的可信身份。
还要额外检查服务端证书的扩展字段,确认证书的用途属性里明确包含了TLS Web服务器身份验证的选项,如果签发的时候选错了证书类型,误选成了普通客户端证书,哪怕其他字段配置都正确,OpenVPN服务端也不会正常加载这个证书,启动阶段就会直接报错退出。
校验服务端证书与私钥的匹配一致性
很多运维在更新证书的过程中,误把其他站点的证书文件上传到了OpenVPN的服务端目录,导致证书和对应的私钥不匹配,这种情况部分版本的OpenVPN服务端启动时不会直接抛出明显报错,但是收到客户端的TLS握手请求时,无法完成密钥协商流程,会直接拒绝连接请求。
你可以用openssl的相关命令分别计算证书和私钥的modulus值,两个输出的字符串完全一致,就说明两者是配对的,如果输出结果不一样,就说明证书和私钥不匹配,需要重新上传正确的配对文件,替换错误的证书或私钥后再重启服务。
还有一个极易被忽略的权限问题,存放服务端私钥的文件权限如果设置得过于开放,比如给了其他普通用户可读的权限,OpenVPN出于安全防护考虑会直接拒绝加载这个私钥,哪怕证书和私钥完全配对,也会导致连接失败,只需要把私钥的权限调整为仅运行OpenVPN进程的用户可读即可。
排查证书相关的配置项错误
打开OpenVPN服务端的.conf配置文件,检查里面指定的ca、cert、key三个配置项的文件路径是否完全正确,很多人迁移OpenVPN服务端的时候,把证书文件移动到了其他目录,但是配置文件里的路径没有同步更新,服务端加载了已经过期的旧证书,就会出现大量客户端连接失败的问题。
还要注意如果你的OpenVPN服务端开启了双向证书校验,不要把服务端证书和客户端证书的配置项搞混,不少新手误把客户端证书的路径填到了服务端cert配置项里,服务启动之后完全无法响应正常的客户端连接请求,这类配置错误在服务端启动日志里会留下明确的报错记录,可以直接对应排查。
完成所有上述排查步骤之后,重启OpenVPN服务端进程,再用客户端发起连接测试,如果还是出现证书相关的报错,可以导出服务端的证书文件,在本地用openssl工具做全链路的校验,确认没有遗漏的异常字段,大部分证书类的连接故障都可以通过上述步骤定位解决,这类排查不需要改动底层网络路由规则,不会影响现有其他正常业务的运行。


