ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

VMware vCenter证书过期处理脚本:巡检到一键轮换的实战指南

VMware vCenter证书过期处理脚本:巡检到一键轮换的实战指南

简介:面向VMware vSphere/vCenter运维的证书过期处理脚本合集,针对SSL/TLS证书超期导致的管理界面不可访问、ESXi主机失联等问题,提供一套从诊断到修复的完整工具链。包内共4个文件,包含1个Python检测脚本与3个Shell修复脚本,分别承担STR证书状态检查、STR服务修复、加密证书更新以及旧备份清理等任务,覆盖证书问题从发现、定位到处置的主要环节。整个压缩包仅7KB,结构精炼,适合中高级虚拟化管理员在测试环境验证后直接使用。已有2045人学习下载。借助这套脚本,可快速识别过期证书的类型与影响范围,按需执行修复并完成环境清理,恢复管理界面正常访问,保障数据传输安全,有效降低证书失效带来的运维风险,为VMware平台长期稳定运行提供实用的自检与恢复手段。

1. VMware 证书过期:看似小问题,实则是整个平台的隐形故障源

在 VMware vSphere 环境里,证书过期引发的故障往往最让人头疼。前端表现为 vCenter Web Client 打不开、API 调用抛 SSL 错误、主机间迁移失败,后端则是各种服务之间的认证全部失效,日志里一片 TLS 错误。这类问题有个共性:表面症状在网络层,实际病根在证书层,而证书过期的时间点总是“恰好”出现在你没有任何心理准备的时候。本文围绕 VMware 证书过期问题处理相关脚本展开,梳理一套从诊断、巡检到手工兜底的完整操作路径,让读者在证书还没出事之前就能提前拦截,真出了事也能有条不紊地恢复。适合 vSphere 运维、虚拟化平台管理员,以及那些被 vCenter 证书问题折磨过的工程师。

这个标题的落点是“脚本”,所以我不打算空谈证书体系的理论,而是把处理思路落实到可执行、可复用的命令和脚本片段上。你不需要在一开始就理解整套证书架构,只需要知道:当 vCenter 或 ESXi 的证书寿命走到尽头时,平台会以各种诡异的方式拒绝工作,而我们要做的就是用脚本把风险前置、把恢复步骤标准化。

2. 证书过期的本质:为什么 vCenter 的自动续期保护不了你

2.1 vCenter 证书体系里到底有哪些证书

vCenter Server 的证书体系并不是单一的一张证书,而是分层管理的多个角色证书。常见的有 STS 签名证书(Security Token Service)、machine SSL 证书(对外通信)、solution user 证书(各组件之间互相调用时使用),以及 vSphere 集群里各 ESXi 主机自己的证书。这些证书的过期时间并不一致,vCenter 内置的自动续期机制能够覆盖一部分,但在实践中会出现“自动续期没有触发”或者“续期后仍然报错”的情况。原因通常是:虚拟机快照恢复、时间跳变、或者某些服务状态异常,导致证书更新的状态机没有走下去。

在实际环境中,我见过次数最多的一个场景是:vCenter 的 STS 证书过期后,整个 Web Client 页面还能打开,但登录时直接报错“无法从 STS 获取令牌”。这时候很多人会以为是账号或网络问题,折腾半天才发现证书早就红了。这样的问题之所以能潜伏很久,是因为证书过期的影响并不是立刻让所有功能瘫痪,而是让一部分依赖令牌的服务间歇性失败,产生一种“玄学故障”的感觉。

2.2 命令行的第一道关卡:用 vcert 和 openssl 看证书实情

处理证书问题,第一步永远是确认证书的真实状态,而不是猜测。我会先用 vCenter 自带的 vcert 工具列出证书,再用 openssl 看证书文件的具体过期时间,两头对比才能定位是证书本身过期,还是服务读到的证书缓存过期。下面是两个最常用的命令示例。

# 在 vCenter 上查看当前使用的证书列表 /usr/lib/vmware-vmca/bin/vcert --list # 查看某个具体证书文件的过期时间 openssl x509 -in /etc/vmware-vmca/domain.crt -noout -dates -subject -issuer

vcert 的--list参数会输出 vCenter 当前所有受管证书的别名、路径和状态。如果你在这个列表里看到任何EXPIRED或NOT_AFTER早于当前日期的条目,基本可以确定问题方向了。openssl x509这一条命令用来直接检查证书文件,-dates输出两个时间点:notBefore和notAfter,后者就是我们将来的触发条件。-subject和-issuer用来确认这张证书是谁发给谁的,防止混淆不同角色的证书。

这里有一个很关键的判断逻辑:如果 vcert 列表显示证书正常,但服务仍报错,那问题很可能出在服务缓存或时间同步上。常见做法是先重启 vCenter 的对应服务(例如service-control --restart vpxd),再看错误是否消失。如果重启后仍然存在证书错误,才考虑走证书轮换的流程。

2.3 自愈功能的失效点:一个让人翻车的默认开关

vCenter 的自动续期机制是针对一部分内部证书的,但有个前提:环境的时间必须准确,而且服务必须处于健康状态。很多平台默认启用了 VMware Certificate Authority 的自动续期,但这个机制在以下情况会静默失效:vCenter 虚拟机被频繁快照回滚、NTP 服务异常导致时间偏差超过容忍范围、或者vmcad服务本身处于 stopped 状态。这些失效点很难从界面直观看到,必须通过服务状态和时间同步状态来判断。

# 检查 vCenter 的时间同步状态 chronyc tracking # 检查证书相关服务是否在运行 service-control --status | grep -E "vmcad|sts|vpxd"

chronyc tracking是 vCenter 这个 Photon OS 上的时间同步命令,输出里的System time和Last offset两栏能直接告诉你当前时间偏差。如果偏差超过几十秒,就值得警惕了,因为证书验证是一个强依赖客户端和服务端时间一致性的事件。service-control --status是 vCenter 服务管理的通用命令,我一般只过滤出与证书、SSO、vpxd 相关的几个服务来查状态。这三个服务的健康是证书自愈机制能正常工作的基础,缺一个都可能导致自动续期“假死”。

3. 自己写巡检脚本:证书过期前一百八十天就该开始报警

3.1 脚本的输入参数与阈值设计

既然证书过期的影响这么大,一个负责任的巡检脚本至少要在证书过期前 180 天就开始关注,并在剩余天数降到 30 天以内时压缩检查频率。我把这个脚本设计成两个阶段:宽限期和紧急期,分别由两个阈值参数控制。脚本的核心逻辑是对 vCenter 的证书目录进行扫描,逐个解析每个证书文件的notAfter时间,然后与当前时间做差,算出剩余有效天数,再与阈值比较。

#!/bin/bash # vcenter_cert_check.sh - 检查 vCenter 证书剩余有效期的巡检脚本 # 用法: ./vcenter_cert_check.sh <warning_days> <critical_days> WARN_DAYS="${1:-180}" # 默认剩余 180 天时告警 CRIT_DAYS="${2:-30}" # 默认剩余 30 天时告警 CERT_CHECK_HOST="localhost" NOTIFY_EMAIL="ops@example.local" CERTS=$(find /etc/vmware-vmca -name "*.crt" -type f) for cert in $CERTS; do EXPIRY=$(openssl x509 -in "$cert" -noout -enddate | cut -d= -f2) EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s) NOW_EPOCH=$(date +%s) REMAIN_DAYS=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 )) if [ "$REMAIN_DAYS" -le "$CRIT_DAYS" ]; then echo "CRITICAL: $cert expires in ${REMAIN_DAYS} days" printf "vCenter 证书 %s 即将过期,剩余 %s 天\n" "$cert" "$REMAIN_DAYS" | mail -s "CRITICAL: vCenter Cert Expiry" "$NOTIFY_EMAIL" elif [ "$REMAIN_DAYS" -le "$WARN_DAYS" ]; then echo "WARNING: $cert expires in ${REMAIN_DAYS} days" else echo "OK: $cert expires in ${REMAIN_DAYS} days" fi done

这个脚本的巡检路径是/etc/vmware-vmca,这是 vCenter 默认存放 CA 相关的证书目录,其中domain.crt是最关键的对外证书。脚本开头接收两个阈值参数:提醒阈值默认 180 天,紧急阈值默认 30 天。你可以将脚本挂在 cron 里定期执行,告警方式除了mail,也可以换成对接企业微信、钉钉机器人的 webhook 脚本,只要能起到提前通知的作用即可。

这个脚本里用cut -d= -f2提取 openssl 输出的enddate字段右侧的时间值,再用date -d把它转成 epoch 秒,最后相减算出剩余天数。这里有一个细节值得说明:date -d对字符串格式有要求,openssl 输出的格式是notAfter=Jan 1 12:34:56 2026 GMT,在大多数 Linux 发行版上能直接被解析。如果你发现解析失败,多半是系统的date命令版本或区域设置问题,可以改成date -d "$(echo "$EXPIRY" | sed 's/GMT/UTC/')"这种更稳妥的写法。

3.2 把巡检脚本变成定时任务:cron 配置与日志管理

手动跑一次脚本只能解决当下的检查需求,真正的价值在于把它固化到 cron 里定期执行。我一般建议每天跑一次,日志输出到/var/log/vcenter-cert-check.log,这样既能追踪历史,又不会因为日志太大占满磁盘。注意 cron 环境和交互式 shell 的环境变量不同,脚本里最好使用绝对路径的openssl、date、mail命令,否则很容易出现脚本手动执行正常、cron 执行却报 command not found 的情况。

# 每天 08:00 执行证书巡检,并保留输出日志 0 8 * * * /opt/scripts/vcenter_cert_check.sh 180 30 >> /var/log/vcenter-cert-check.log 2>&1 # 查看最近一周的巡检日志 grep "CRITICAL\|WARNING" /var/log/vcenter-cert-check.log | tail -n 20

cron 的写法很简单,但有两个坑值得提前说:一是环境变量,二是时区。vCenter 的 Photon OS 默认时区可能是 UTC,如果你的业务期望的是本地时间的早晨八点,建议在 cron 表达式里按标准时间计算,或者直接改系统的时区配置。日志里如果没有 CRITICAL 和 WARNING 输出,并不代表脚本没执行,可能是输出被2>&1吞掉了或者 cron 服务本身没启动。另一个我踩过的坑是:脚本里的mail命令在 vCenter 的默认环境里未必可用,没有邮件服务器的环境会一直卡在发送环节。更好的方案是让脚本只负责输出结构化结果,由外部系统(例如定时采集脚本输出的监控平台)来负责告警。

4. 真过期了怎么办:从诊断到轮换的完整自救流程

4.1 确认受影响范围:哪些服务正在被证书错误拖累

证书过期之后,vCenter 的所有外部接入都会出问题,但没有必要一开始就慌。我的处理顺序是这样的:先看 vCenter 的服务状态,找出哪些服务处于异常或非运行状态;再看 vSphere Web Client 能否登录,能登录的情况下优先从 UI 走一遍告警,不能登录就直接走命令行。在实际操作中,vCenter 的 vpxd 是最敏感的组件,它负责管理整个 vSphere 集群的状态,一旦证书失效,vpxd 可能直接停止响应。

# 查看 vCenter 所有服务的运行状态 service-control --status # 单独检查 vpxd 服务状态 service-control --status vpxd # 尝试重启 vpxd 服务,有时能临时让平台恢复可用 service-control --restart vpxd

service-control --status在不带参数时会输出全部服务状态,输出列表非常长,我通常配合 grep 过滤关键服务。如果vpxd状态为 stopped,可以先尝试重启它,因为某些证书过期场景里 vpxd 只是加载证书失败导致进程退出,重启后它可能重新读取到新证书(前提是证书已经轮换)。如果重启之后 vpxd 还是起不来,再看vmcad的状态,因为它是签发和管理证书的核心服务,vmcad异常会直接影响其他组件拿证书。

在实际处理中要区分两个概念:证书轮换(renew)和替换(regenerate)。轮换是使用现有的 CA 体系签一张新证书,替换则是把当前 CA 本身都换掉。vCenter 支持通过 UI 的证书管理页面进行轮换,但命令行方式在排障时更直接。如果只是单张证书过期,轮换通常足够;如果是因为 CA 私钥泄露之类的原因需要彻底重建,那就得走替换流程,操作复杂度显著上升。

4.2 命令行轮换事件的正确顺序:先备份,再操作

在处理证书过期问题时,最重要的一条原则是:任何写入操作之前必须备份。vCenter 提供了证书备份的专用命令,应该先执行备份,再修改任何证书配置。这条规则看起来多余,但在实际操作中,太多人跳到轮换步骤后发现问题,想回滚却发现自己根本没有对应时间点的备份。我处理过的案例里,至少有两起是因为没有备份,轮换失败后不得不从虚拟机快照恢复,而恢复之后又造成了新的状态不一致。

# 备份当前证书库到指定目录 /usr/lib/vmware-vmca/bin/vcert --backup /root/vcert-backup-$(date +%Y%m%d) # 检查备份是否生成 ls -l /root/vcert-backup-*

vcert --backup会把当前受管证书统一导出到一个时间戳目录里,这个目录里包含证书、密钥和 CA 链。这个备份操作本身不会中断服务,可以放心在业务低峰期执行。备份完成后,再去执行轮换,轮换命令如下:

# 一键轮换所有受管证书 /usr/lib/vmware-vmca/bin/vcert --renew # 轮换完成后重启相关服务 service-control --restart all

vcert --renew会基于现有的 CA 签发新证书,覆盖旧的证书文件。这个命令在正常环境下能在一两分钟内完成,但如果 vCenter 的 CA 状态本身已经损坏,它可能会卡住或者报错。这时不要反复执行,而是先查看vmcad服务的日志,通常日志里会有具体的失败原因,比如“key mismatch”或“certificate authority not found”。轮换完成后一定要执行service-control --restart all,因为 vpxd、sts 等服务不会自动感知到证书文件的变更,必须重启才能加载新证书。

4.3 vCenter 恢复后,ESXi 主机侧的证书同步

vCenter 证书轮换成功之后,还有一个经常被忽略的步骤:ESXi 主机与 vCenter 之间的信任关系需要同步刷新。如果 ESXi 主机还持有旧的 vCenter 证书指纹,会在后续的迁移、主机操作时报证书错误。vSphere 的常见做法是在 vCenter 里对每台主机重新配置证书信任,或者在 ESXi 主机上直接刷新 vCenter 的证书存储。

# 在 ESXi 主机上查看当前 vCenter 证书指纹 vim-cmd vimsvc/auth/verify_certificates # 确认问题后,在 vCenter 侧对主机重新建立信任 # 这一步通常在 vSphere UI 的主机管理页面完成,命令行仅用于诊断

ESXi 的证书同步问题往往是 vCenter 证书过期处理完之后,用户在新的一天发现虚拟机的 vMotion 全都失败,才反过来追查。给主机重新建立信任的流程需要把主机从集群移除再重新加入?并不需要,vCenter 的证书管理界面里可以直接执行“刷新证书”操作,命令行的vim-cmd更多用来做验证确认。这里要特别提醒:如果环境里有多个 vCenter 纳管同一个 vSphere 域,证书的同步顺序应该按照域内的依赖关系从低位到高位依次处理,否则可能引发新的不一致。

5. 避坑指南:证书处理中那些让人反复翻车的细节

5.1 证书轮换成功,但服务仍然报错的诡异局面

现象:执行完vcert --renew后,vcert --list显示所有证书的过期时间都更新到了未来,但 vSphere Web Client 登录时依然报错。

原因:这种情况大概率是服务进程还在使用旧证书。证书文件在磁盘上已经被更新,但 vpxd 等长驻进程在启动时加载了旧证书的副本到内存,没有重新读取。也有一部分情况是 STS 服务缓存了旧的签名证书信息。

解决:不要盲目继续轮换证书,而是先执行service-control --restart all。如果重启后仍然报错,检查 STS 服务的日志和证书存储,确认新的证书是否被正确部署到对应的目录。我在实际处理中遇到过一次,重启all参数太宽泛,部分服务没起来,又单独补了一次service-control --restart sts才恢复正常。

5.2 备份目录存在,但备份内容不完整

现象:打算回滚时,发现/root/vcert-backup-*目录里只有证书文件,没有密钥文件,导致回滚命令无法执行。

原因:vcert --backup的备份范围取决于执行时的权限和 vCenter 的配置。某些受管证书的私钥存放在独立的密钥库中,备份命令不会自动导出。这在 vCenter 使用硬件安全模块(HSM)存储私钥的环境里特别常见。

解决:备份完成后,第一时间检查备份目录的文件清单,确认.key文件存在。使用 HSM 的环境需要在备份命令中额外指定密钥库导出参数,或者在备份前确认 HSM 的密钥导出策略允许读取。没有密钥的备份在实际回滚时等于没有备份,这是一个很现实的教训。

5.3 时间偏差导致新证书签发后立即“过期”

现象:轮换完成后,新证书显示的notAfter时间明明是未来,但平台依然提示证书无效。

原因:签发新证书时,vCenter 的vmcad服务会以当前系统时间作为notBefore和notAfter的基准。如果系统时间比实际时间快了一个月,签发出来的证书尽管有效期是一年,但实际可用时间被压缩到了十一个月。更离谱的情况是系统时间停在了过去,导致新旧证书的时间窗口重叠或空隙。

解决:轮换之前先确认系统时间与 NTP 对齐。执行chronyc makestep强制时间同步,然后再检查同步后的结果。时间同步完成后,重新执行一次证书轮换,并用openssl x509 -enddate确认新证书的有效期起点与当前时间吻合。这个坑我踩过一次之后,再处理任何证书问题都会把时间同步作为前置步骤。

5.4 不要用 VM 快照回滚来“解决”证书过期

现象:证书过期后,有同事想走捷径,直接把 vCenter 虚拟机恢复到一个月前的快照,以为证书就变回有效状态了。

原因:快照回滚确实会把证书文件恢复到过去的时间点,但与此同时,vCenter 数据库里记录的组件状态、解决方案用户信息也会回到过去。快照回滚之后,数据库状态和虚拟机外部组件(例如已加入域的 ESXi 主机)之间的信任关系可能已经变化,造成新的不一致。

解决:证书问题必须走证书轮换或恢复流程,而不是快照。快照只能作为最后万不得已的应急手段,而且回滚之后必须做完整的服务一致性检查。这个问题的教训是:不要试图用一个时间点的状态覆盖另一个时间点的现实,虚拟化平台的各个组件之间状态一致性的重要性远超你的想象。

6. 手工兜底:当自动轮换不可用时的最后一个办法

6.1 确认一个证书真的过期后,如何优雅地重建它

在某些环境中,vCenter 的证书自动轮换功能可能因为服务损坏或配置异常而不可用。这时候需要手工生成新的证书并覆盖旧的证书文件。在手工操作之前,先确认三个条件:当前 CA 服务是否可用、旧的证书文件路径是否明确、私钥文件是否存在。这三项确认完之后,按下面的步骤操作:

# 生成新的自签名证书(有效期设置为 825 天) openssl req -x509 -newkey rsa:2048 -keyout /etc/vmware-vmca/domain.key \ -out /etc/vmware-vmca/domain.crt -days 825 -nodes \ -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/CN=vcenter.example.local" # 重新生成 vCenter 的 machine SSL 证书并部署 /usr/lib/vmware-vmca/bin/vcert --regen --cert domain.crt # 重启 vCenter 服务使新证书生效 service-control --restart all

这里openssl req -x509生成的证书是自签名证书,使用方式与 vCenter 原有的 CA 签发证书不完全一致,但作为一种应急手段是可用的。-keyout指定私钥输出路径,-nodes表示不加密私钥文件,防止 vCenter 服务启动时要求输入密码而导致自动启动失败。-days 825是一个实践中常用的有效期,比 365 天长但小于浏览器对自签名证书的最大信任时长。vcert --regen命令的作用是把新生成的文件注册到 vCenter 的证书管理库里,这一步不能省略,否则直接用文件覆盖不一定会被服务接受。

手工重建证书是一个兜底方案,不是常规操作。如果这个环境后续还要继续运维,我会建议在手工重建完成后,尽快把 vCenter 升级到补丁级别更高的版本,并在证书管理页面重新走一遍标准的证书轮换流程,让整个证书体系回到被支持的状态。

6.2 验证恢复结果的三条命令

恢复完成后,需要从三个维度验证:证书文件本身是否有效、证书与私钥是否匹配、服务是否正常对外提供 TLS 端点。以下三条命令是我每次处理完都必跑的验证序列:

# 检查证书是否有效 openssl x509 -in /etc/vmware-vmca/domain.crt -noout -dates # 用私钥检查证书与私钥是否匹配 openssl x509 -in /etc/vmware-vmca/domain.crt -noout -pubkey > /tmp/cert-pub.pem openssl pkey -in /etc/vmware-vmca/domain.key -pubout > /tmp/key-pub.pem diff /tmp/cert-pub.pem /tmp/key-pub.pem # 用 openssl s_client 测试 vCenter 对外端口 echo | openssl s_client -connect localhost:443 2>/dev/null | openssl x509 -noout -dates

第一条验证证书有效期范围,第二条验证公私钥配对,第三条模拟外部客户端的 TLS 握手过程。这三条命令全过,基本可以判断 vCenter 的证书层面已经恢复正常。第三条命令里的openssl s_client是 TLS 故障排查的利器,它会输出完整的握手过程和服务器证书链信息。如果握手过程报错,错误信息里通常直接写着证书过期或者证书链不完整。

6.3 把这次教训沉淀成下一次的快速反应机制

在处理完一次证书过期事件之后,我会把相关的操作命令和判断标准整理成一个标准操作文档,连同巡检脚本一起放进团队的运维资料库。这么做是因为证书问题有一个特殊性:它不像磁盘满了或者 CPU 跑高那样有持续的告警,而是一个“定时炸弹”,引爆时间和危害程度都很难提前预估。如果每次都是等用户报障才开始排查,每次都要从头分析症状,那运维的响应速度和稳定性就无从谈起。

关于巡检频率,我习惯使用每天定时执行,而不是每周或每月。证书的有效期有数百天,似乎每周检查一次也足够了,但环境里可能存在多个证书、多个签发源,偶尔会有某个证书被意外替换成短周期版本。每天检查的开销极小,却能早一天发现异常,值得长期坚持。解决思路是先风险排除再操作,先备份再写入,先验证再收工。这实际上是一个做事习惯问题——证书处理本身并不复杂,复杂的是在压力之下保持操作顺序不变形。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进