4 排查环境准备:用这四把刀快速验证

做运维这么多年,每次出 CRL 问题,我第一反应不是翻文档,而是先把几个工具备好。openssl、curl、wget、ldapsearch,这四样东西就像工具箱里的螺丝刀、扳手、钳子和万用表——缺哪个都不顺手。

我习惯在服务器上提前装好这些包,别等到告警响了才临时 yum install。下面一个个说怎么用,以及在实战中哪些坑容易踩。

4.1 工欲善其事——必备工具清单

先把这四把刀的基本信息列清楚。你可以在排查前对照下表确认环境是否齐备。

工具 核心用途 典型命令示例 安装方式(CentOS/Debian)
openssl 解析证书、验证 CRL、查看 OCSP 响应 openssl crl -in crl.pem -text yum install openssl / apt install openssl
curl HTTP/HTTPS 下载 CRL 文件,支持重定向和证书校验 curl -O http://example.com/crl.crl yum install curl / apt install curl
wget HTTP/FTP 下载 CRL,支持断点续传、递归 wget http://example.com/crl.crl yum install wget / apt install wget
ldapsearch 查询 LDAP 目录中的 CRL 属性(如 certificateRevocationList) ldapsearch -x -H ldap:// -b "cn=CRL,dc=..." yum install openldap-clients / apt install ldap-utils
我个人习惯:在排查机上跑一条 which openssl curl wget ldapsearch,缺什么立刻补。别因为工具没装浪费半小时。

4.2 openssl:证书链与 CRL 的瑞士军刀

openssl 几乎能处理所有 PKI 相关的事情。我最常用它来验证下载到的 CRL 文件是否合法——是不是被篡改过?签名对不对?有效期过了没?

查看 CRL 文件内容

# 解析 DER 格式的 CRL(常见于 Windows CA)
openssl crl -inform DER -in crl.der -text -noout

# 解析 PEM 格式的 CRL
openssl crl -inform PEM -in crl.pem -text -noout

输出里重点看这几项:

  • Issuer – 签发该 CRL 的 CA 名称,是否与你信任的根一致。
  • Last Update / Next Update – 有效期窗口,过期了肯定验证失败。
  • CRL Number – 序号递增,如果服务器拿到的是旧号,说明 CDN 缓存没刷新。
我曾经遇到一个坑:同事下载 CRL 后直接扔给 openssl 验证,没加 -inform DER,结果 openssl 报错“bad decode”。嗯,默认它猜 PEM,DER 文件要显式指定。

验证 CRL 签名

# 用 CA 证书验证 CRL 的签名
openssl crl -in crl.pem -CAfile ca.crt -verify

如果返回 verify OK,说明 CRL 是合法的。如果报 verify error,可能是 CA 链不全或 CRL 被中间人篡改。

4.3 curl 与 wget:两个下载利器

CRL 分发点多数是 HTTP URL。curl 和 wget 都能下载,但特点不同。我基本是两个都装,看场景用。

特性 curl wget
默认输出到 stdout 是,需要 -o 或 -O 自动保存到文件
支持 HTTP 重定向 默认不跟随,加 -L 默认跟随
支持 HTTPS 证书校验 默认严格校验,可 -k 忽略 默认校验
断点续传 -C - -c
查看响应头 -I 或 -v --server-response

实战下载 CRL 文件:

# 用 curl 下载,并重命名文件
curl -L -o mycrl.crl http://cdp.example.com/crl/root.crl

# 用 wget 下载,保存原始文件名
wget http://cdp.example.com/crl/root.crl

# 想知道服务器返回了什么状态码和头部?加 verbose
curl -v -L -o /dev/null http://cdp.example.com/crl/root.crl

我每次下载完都会顺手 ls -lh 看一眼文件大小——空文件或几字节的“假 CRL”遇到过不止一次。那种情况多半是 CDN 缓存了错误响应。

一个小技巧:如果服务器返回 302 跳转到 HTTPS,curl 不加 -L 只会拿到空内容。你想想看,很多人查了半天发现 CRL 只有 0 字节,其实就是少了这个 -L。

4.4 ldapsearch:LDAP 分发点的救星

有些 CA 把 CRL 放在 LDAP 目录里。我早期看到 ldap:// 开头的 CDP 地址就头疼,后来用熟了发现也就三条命令的事。

基本查询语法

# 匿名查询 base DN 为 "CN=CRL,CN=Server1,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=com"
ldapsearch -x -H ldap://ldap-server:389 \
  -b "CN=CRL,CN=Server1,CN=CDP,CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=com" \
  -s base \
  "objectClass=*" certificateRevocationList

# 如果 LDAP 要求认证
ldapsearch -x -H ldap://ldap-server:389 \
  -D "CN=admin,DC=domain,DC=com" -W \
  -b "..." -s base certificateRevocationList

返回的结果里 certificateRevocationList 属性值就是 CRL 的二进制 DER 数据。怎么存下来?可以加 -o ldif-wrap=no 然后用 awk 或 base64 解码——不过说实话,我更推荐先确认 LDAP 可达性,再写脚本拉取。

我曾经踩过的坑:LDAP 端口是不是被防火墙封了?连通性测试不要用 ldapsearch 直接查,先 telnet ldap-server 389 看能不能通。有一次我查了半小时 LDAP 语法,结果发现端口不通。

4.5 工具选择流程图:一图理清排查路径

下面这张图总结了我自己的排查思路——拿到 CRL 分发失败告警后,按分发点类型选不同工具,快速定位问题。

CRL分发失败排查工具选择流程 CRL 分发失败排查工具选择流程 CRL 分发失败 CDP 类型? HTTP / LDAP HTTP(S) 使用 curl / wget LDAP 使用 ldapsearch 检查网络连通性 检查网络连通性 使用 openssl 验证 CRL 签名、有效期、序列号 定位问题原因 💡 提示: 先测连通性再查语法 避免无效排错

4.6 小结

说了这么多,其实核心就一句话:用什么工具,取决于 CDP 是什么协议。HTTP 用 curl/wget,LDAP 用 ldapsearch,CRL 内容校验用 openssl。别混着用,也别跳过环境检查。

我每次排查前都会默默敲一行 which openssl curl wget ldapsearch —— 嗯,确认工具都在。然后再看分发点 URL,选对应的“刀”下手。下次出现告警,你也可以试试这个节奏。