证书可以仍在有效期内,VPN 却仍然 报出认证失败,于是有人断定证书已被吊销。这是三件不同的事。吊销数据必须由执行验证的设备去获取,来源是证书自身标明的发布端点。当该设备无法访问该端点时,检查失败的原因与证书状态无关。

获取路径归验证方所有

先确定验证方是谁。笔记本检查网关证书时,由笔记本执行获取;网关检查客户端证书时,由网关执行。后端的认证服务还可能成为第三个验证方,拥有自己的网络位置。三者的上网路径和代理配置各不相同。在管理员工作站上收集的证据,说明不了 DMZ 内服务器的情况。

在改动任何东西之前,先记下证书、验证方、尝试时间和确切的状态码。

从证书里读出发布端点

证书指明了自身状态所在的位置。请直接读取这些字段,不要猜测 CA 地址。

openssl x509 -in gateway.cer -noout -text | grep -A3 "CRL Distribution Points"
openssl x509 -in gateway.cer -noout -text | grep -A2 "Authority Information Access"

第一个扩展列出 CRL 分发点,第二个扩展列出颁发机构信息访问方式,其中可能包含 OCSP 状态查询和颁发者证书获取。两者是不同的机制,OCSP 响应器并不是 CRL 文件。发布主机往往是普通 Web 服务器,而不是 CA 机器,因为离线颁发者可以签发 CRL,再由另一台服务器分发。因此,把规则说成允许访问 CA 的防火墙策略,无论实施还是评审都过于含糊。

在验证设备上测试获取

在真正执行验证的环境里运行获取测试,使用已获批准的证书材料,且不涉及私钥。

certutil -urlfetch -verify .\client-test.cer
curl -sS -o /dev/null -w "%{http_code}\n" http://crl.example.com/ca.crl

certutil 运行会校验证书链,并报告哪些 URL 获取成功或失败;curl 调用则从同一台主机测试一个发布地址,只返回状态码。从可达地址获取失败,说明是内容或签名问题;连接错误则说明是路由、DNS 或代理问题。两个结果都要保留,因为一次获取成功并不能证明整条链都可用。把示例中的主机和路径换成证书里找到的分发点。

把数据缺失与吊销状态区分开

从外部看,四种结果很相似:端点不可达、列表过期、列表由错误的颁发者签名,或者证书确实已被吊销。只有最后一种属于状态结论,也只有它才足以撤销访问权限。缓存会让局面更复杂,因为先前取到的数据可能一直掩盖着损坏的发布路径,直到下一次刷新。关闭吊销检查、删除无关证书或重启网关,都是用动作代替诊断。

修复之后,强制进行一次全新认证,确认目的状态获取能够成功。如果存在受控的测试身份,还要确认它仍被拒绝,因为取消检查换来的可用性并不等于修复。

相关文章