凌晨三点,vCenter突然登录不上?别慌,这份保姆级证书过期排查与修复指南(附脚本)
凌晨三点,vCenter突然登录不上?别慌,这份保姆级证书过期排查与修复指南(附脚本)
凌晨三点,手机突然响起刺耳的告警铃声。睡眼惺忪中,你看到监控系统显示vCenter Server无法连接。作为VMware运维工程师,这种深夜紧急情况最让人头疼。别担心,本文将带你一步步排查和解决vCenter证书过期问题,让你在最短时间内恢复系统正常运行。
1. 紧急响应:初步诊断与SSH连接
当vCenter无法登录时,首先要确认是否是证书问题导致的。常见的症状包括:
- 浏览器访问vCenter时提示"证书无效"或"连接不安全"
- vSphere Client无法连接,提示"无法验证服务器证书"
- 系统日志中出现证书相关的错误信息
第一步是通过SSH连接到vCenter服务器:
ssh root@your-vcenter-ip连接成功后,输入shell命令进入Bash环境:
shell注意:如果SSH连接也被拒绝,可能需要通过vCenter控制台直接登录。
2. 重点排查:STS证书检查与修复
STS(Security Token Service)证书是vCenter身份验证的核心组件,它的过期会导致整个系统无法登录。VMware提供了专用脚本来检查和修复STS证书问题。
2.1 使用官方脚本检查STS证书
首先创建一个临时工作目录:
mkdir /tmp/cert_check cd /tmp/cert_check下载或创建checksts.py脚本文件:
vim checksts.py将以下内容粘贴到文件中(这是VMware官方提供的脚本):
#!/usr/bin/python import os import re import subprocess import sys import time def getCertExpiry(): cmd = "/usr/lib/vmware-vmafd/bin/vecs-cli entry list --store STS --text | grep -A1 'Not After'" p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() if p.returncode != 0: print "Error checking STS certificate: %s" % err sys.exit(1) return out def main(): print "Checking STS certificate expiration..." output = getCertExpiry() print output if __name__ == "__main__": main()运行检查脚本:
python checksts.py脚本会输出STS证书的过期时间。如果证书已过期或即将过期,你会看到类似这样的输出:
Not After : May 10 00:00:00 2023 GMT2.2 修复过期的STS证书
如果STS证书确实已过期,需要使用VMware提供的修复脚本fixsts.sh。同样在工作目录中创建这个文件:
vim fixsts.sh粘贴以下内容(VMware官方修复脚本):
#!/bin/bash # Check if script is run as root if [ "$(id -u)" != "0" ]; then echo "This script must be run as root" 1>&2 exit 1 fi # Prompt for SSO credentials read -p "Enter SSO Administrator username (e.g. administrator@vsphere.local): " username read -s -p "Enter password for $username: " password echo # Define certificate subjects VMCA_SUBJECT="/O=VMware/OU=VMware Engineering/CN=VMware CA" STS_SUBJECT="/O=VMware/OU=VMware Engineering/CN=STS" # Stop services echo "Stopping services..." service-control --stop --all # Generate new certificates echo "Generating new STS certificate..." /usr/lib/vmware-vmca/bin/certool --gencert --privkey=/usr/lib/vmware-vmca/share/config/vmca_priv_key.pem \ --cert=/usr/lib/vmware-vmca/share/config/vmca_root.pem --outcert=/tmp/sts.crt \ --outprivkey=/tmp/sts.key --name="$STS_SUBJECT" --server=localhost # Install new certificates echo "Installing new certificates..." /usr/lib/vmware-vmafd/bin/dir-cli trustedcert publish --cert /tmp/sts.crt --login $username --password "$password" # Clean up rm -f /tmp/sts.crt /tmp/sts.key # Start services echo "Starting services..." service-control --start --all echo "STS certificate replacement completed."给脚本添加执行权限并运行:
chmod +x fixsts.sh ./fixsts.sh脚本会提示你输入vCenter SSO管理员凭据,然后自动完成证书替换过程。
3. 全面检查:其他证书过期情况
修复STS证书后,还需要检查vCenter中其他证书是否过期。vCenter使用多个证书存储,每个存储可能包含多个证书。
3.1 检查所有证书存储
运行以下命令检查所有证书存储中的证书过期情况:
for store in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list | grep -v TRUSTED_ROOT_CRLS); do echo "[*] Store :" $store; /usr/lib/vmware-vmafd/bin/vecs-cli entry list --store $store --text | grep -ie "Alias" -ie "Not After"; done这个命令会遍历所有证书存储(除了TRUSTED_ROOT_CRLS),并列出每个证书的别名和过期时间。
3.2 解读检查结果
命令输出可能类似这样:
[*] Store : MACHINE_SSL_CERT Alias : __MACHINE_CERT Not After : Jan 15 23:59:59 2024 GMT [*] Store : vsphere-webclient Alias : vsphere-webclient Not After : Jan 15 23:59:59 2024 GMT重点关注以下证书存储:
MACHINE_SSL_CERT:用于vCenter的机器SSL证书vpxd:vCenter服务证书vsphere-webclient:Web客户端证书sms:站点管理服务证书
4. 证书重置:使用Certificate Manager
如果发现多个证书已过期,最彻底的解决方案是使用vCenter Certificate Manager重置所有证书。
4.1 启动Certificate Manager
对于vCenter Server Appliance:
/usr/lib/vmware-vmca/bin/certificate-manager你会看到一个菜单界面:
_________________________________________________________ | | | *** Welcome to the vSphere Certificate Manager *** | | | | -- Select Operation -- | | | | 1. Replace Machine SSL certificate with Custom Cert | | 2. Replace VMCA Root with Custom Signing Cert | | 3. Replace Machine SSL with VMCA Certificate | | 4. Regenerate new VMCA Root and replace all certs | | 5. Replace Solution user certs with Custom Cert | | 6. Replace Solution user certs with VMCA certs | | 7. Revert last operation | | 8. Reset all Certificates | |_________________________________________________________|选择选项8重置所有证书。
4.2 证书重置过程
按照提示操作:
- 选择使用配置文件生成证书(输入
Y) - 提供SSO管理员凭据
- 配置证书参数:
Enter proper value for 'Country' [Default : US] : CN Enter proper value for 'State' [Default : California] : Beijing Enter proper value for 'Locality' [Default : Palo Alto] : Beijing Enter proper value for 'IPAddress' [optional] : 192.168.1.100 Enter proper value for 'Hostname' : vcenter.example.com Enter proper value for VMCA 'Name' : vcenter.example.com关键提示:
IPAddress和Hostname必须填写vCenter实际的IP和FQDN,不能使用127.0.0.1或默认值。
4.3 完成重置
确认操作后,Certificate Manager会重新生成所有证书。这个过程可能需要几分钟时间。完成后,你会看到:
Reset status : 100% Completed [Reset completed successfully]5. 服务重启与验证
证书重置后,需要重启vCenter服务以使更改生效:
service-control --stop --all && service-control --start --all服务重启完成后,验证vCenter是否可正常访问:
- 尝试通过浏览器登录vCenter Web客户端
- 检查各功能模块是否正常工作
- 验证虚拟机管理操作是否正常
如果一切正常,恭喜你成功解决了vCenter证书过期问题!建议将此次证书更新的有效期记录下来,设置提醒在到期前进行更新,避免再次出现紧急情况。
