在企业远程办公的OpenVPN双向证书认证部署场景中,不少运维人员都遇到过大面积客户端连接失败的问题,排查客户端证书有效期、网络连通性、服务端端口配置都没有异常,最终定位到故障根源是证书吊销列表CRL异常。本文结合实际生产环境的排查流程,完整梳理OpenVPN证书吊销列表连接失败排查的全步骤,覆盖配置校验、故障定位、修复验证全流程,帮助运维快速定位同类故障。
故障触发的典型场景与原理铺垫
很多企业的OpenVPN服务部署在内网的CentOS系列服务器上,作为远程办公的唯一准入网关,之前已经配置了证书吊销机制,用来拉黑离职员工的旧客户端证书,保障内网访问边界安全。不少运维反馈,在没有修改服务端核心配置的前提下,所有合法的新老客户端都无法建立VPN连接,服务端日志持续返回证书校验失败的报错,反复核对客户端的证书有效期和CA根证书配置都找不到问题。
OpenVPN的证书吊销列表是由CA服务统一签发的专属列表,所有被标记为吊销的客户端证书序列号都会被记录在这个文件中,服务端每收到一次客户端的连接请求,都会优先将客户端提交的客户端证书和当前加载的CRL文件做比对,一旦CRL本身出现损坏、过期、不可读的异常状态,哪怕是完全合法的未吊销证书,也会被服务端直接判定为校验失败,拒绝连接请求。
第一步:检查服务端CRL配置路径有效性
很多运维在初期部署OpenVPN的时候,为了调试方便,直接把server.conf配置文件里的crl-verify参数指向了临时目录下的CRL文件,后续清理服务器临时文件、迁移服务目录的时候,不小心删除了原CRL文件,OpenVPN服务重启的时候不会直接抛出配置错误,只会静默加载空的缓存,导致所有客户端的证书校验流程直接失败。
排查这一步的时候,直接登录OpenVPN服务端,打开服务端配置文件找到crl-verify对应的路径,确认该路径下的文件真实存在,之后执行openssl crl -in 对应路径的crl.pem -noout -text命令查看文件内容,如果输出乱码或者直接返回格式错误的提示,就说明当前使用的CRL文件已经损坏,无法正常读取。
第二步:校验CRL的签发时间与有效期
绝大多数团队部署完CRL校验机制之后,都不会主动关注CRL本身的有效期,CA签发的CRL默认自带有效时长,一旦超过预设的有效期,OpenVPN的证书校验模块会默认将所有待校验的证书判定为不可信,直接拒绝连接,这类故障的隐蔽性很强,很多人会下意识忽略CRL本身也有过期属性,毕竟CA根证书的有效期通常很长。
执行openssl crl -in 对应路径的crl.pem -noout -nextupdate命令,就可以直接输出当前CRL文件的过期时间,如果显示的时间早于服务器当前的系统时间,就说明CRL已经过期失效,只需要回到CA服务器重新生成新的CRL文件,覆盖服务端原有路径的文件即可,多数新版本的OpenVPN支持CRL热加载,不需要重启VPN服务就可以生效。
第三步:排查CRL权限与加载冲突问题
部分运维出于安全加固的需求,给VPN相关的证书文件设置了非常严格的访问权限,把CRL文件的属主改成了root用户,但是OpenVPN服务运行时默认使用的是低权限的openvpn专属用户,没有权限读取CRL文件,这时候服务端日志不会直接返回权限不足的报错,只会返回通用的证书校验失败提示,很容易误导运维去反复排查客户端的证书配置。
排查这类问题的时候,可以先查看CRL文件的属主和可读权限,保证运行OpenVPN进程的用户至少拥有该文件的可读权限,同时不要把CRL文件和CA根证书、服务端证书、客户端证书存放在同一个加载目录下,避免OpenVPN加载证书链的时候把CRL文件误判为普通证书,引发不必要的加载冲突。
常见排查误区与验证方式
不少运维遇到证书校验失败的问题,第一反应是重新生成所有客户端证书,反而把简单的故障复杂化,在开展OpenVPN证书吊销列表连接失败排查的过程中,可以临时注释掉server.conf配置文件里的crl-verify配置项,重启服务之后如果客户端可以正常建立VPN连接,就可以直接确定故障根源和CRL相关,不需要再浪费时间排查其他证书链路的问题。
故障修复完成之后,建议在CA侧配置CRL的定期自动生成和同步任务,定时把新生成的CRL文件推送到OpenVPN服务端的指定路径,同时在服务端部署简单的定时检查脚本,一旦检测到CRL文件不可读、即将过期,就第一时间向运维人员发送告警,避免后续再出现同类的大面积VPN连接中断问题。

