之前帮客户处理了一个因证书过期导致 vCenter Server 无法登录的问题,在此记录一下,因为时间过去有点久了,可能会有些地方描述的不是很清楚,所以就当作参考就行。客户环境是一个非常老的 vCenter Server 5.5 版本并基于 Linux 版本的 VCSA (当时这个版本还有基于 Windows 的,注意区别),早期可以使用基于 C# 开发的 Windows 客户端进行访问和管理 vCenter Server,当然这个版本也支持基于 Adobe Flex (也就是Flash)的 vSphere Web Client 并通过网页进行访问管理。
解决过程比较麻烦,牵涉到证书的替换和服务的重新注册,因此建议你在执行这些操作时,请一定做好快照和备份。自 vCenter Server 6.x 及以后,VMware 出了很多脚本工具可以很方便的处理证书过期等问题,可以参看以下 KB 知识库,但是在这之前的版本可就没那么方便了!
由于无法登录 vCenter Server ,所以只能通过客户端工具连接到运行 vCenter 的 ESXi 主机上,并通过控制台查看 vCenter 的启动状态。经控制台查看,vCenter 的运行状态似乎是正常的,并且可以通过 SSH 以 ROOT 账户登录到 vCenter 的 Shell 命令行,同时可以访问 vCenter 的 VAMI 管理后台(https://ip-or-fqdn:5480)并查看服务状态,好像也没有什么异常情况。
当时第一直觉觉得是 vCenter Server 的什么证书过期了导致的,因为这个版本的 vCenter Server 5.5 到现在已经过去这么久了,可能证书什么的应该要到期了,所以想着怎么查看这个版本的证书是否已到期,但是因为没法登录 vCenter Server,肯定没法通过网页查看,于是开始进行以下排查并故障处理。
1、SSH 登录到 vCenter,使用下面命令查看证书,发现确实有证书已经过期(下图其实是 STS 证书)。
openssl x509 -in /etc/vmware-sso/keys/ssoserversign.crt -noout -dates
2、5.5 版本 vCenter Server 的 SSL 证书可以在 VAMI 管理后台开启证书自动更新功能,无需要手动进行更新,只需要登录 VAMI 管理后台开启后,当 vCenter Server 重启系统后会自动去更新。具体在 VAMI 管理后台的那个选项卡已经不记得了,不过 VAMI 后台页面的功能很少,应该很容易找到。
3、vCenter Server 勾选证书自动更新功能后,将 vCenter 重启,你可以使用 Shell 重启或者在 VAMI 后台或者直接通过 ESXi 控制台都行。其实,在重启 vCenter Server 的过程中,也能看到是因为证书过期造成的vCenter 故障,通过 ESXi 打开 vCenter 虚拟机的控制台并查看启动过程,可以看到启动过程中有一些报错,具体报错信息不太记得了,大概是启动某个并配置某个服务的时候,但是由于检测到证书已经过期了,所以跳过了该配置。当vCenter Server 虚拟机重启后,依然无法使用客户端进行连接,因为只是更新了 vCenter Server 的 SSL 证书,上面图片中的证书其实是 STS 证书,还需要对该证书进行更新。
注:vCenter VAMI 管理后台开启 SSL 证书自动生成后,需要把它关闭掉,不然每次重启 vCenter 都会重新生成新证书。
4、首先,5.5 版本的 vCenter Server 的 STS 证书我是通过 vSphere Web Client 进行更新的(可以见下图),我没有找到通过命令行进行更新的方法,所以现在要更新这个证书面临着两个问题,第一个问题是 STS 证书必须使用命令行手动生成新的证书文件;第二个是由于现在 vCenter Server 服务有问题无法登录到 vSphere Web Client。
5、先说第二个问题, 由于 vCenter Server 证书过期问题导致服务也有问题无法登录 vSphere Web Client。有一个小技巧可以临时处理这个问题,就是将 vCenter Server 的系统时间调成证书过期之间的时间,然后重新启动 vCenter Server 让服务启动正常,然后登录到 vSphere Web Client 然后使用手动生成的新的 STS 证书完成替换。
想临时处理这个问题,也有很多步骤。首先,第一步,STS 证书的管理必须要使用 SSO 管理员用户(administrator@vsphere.local)进行更新,所以你需要进入 VAMI 管理后台去启动 vCenter Server 的 SSO 用户,这个比较简单,在后台启用并配置 SSO 用户的密码即可,如果之前你已经在使用 SSO 用户了那就跳过这一步。
第二步,由于当前 vCenter Server 的系统时间已经在 STS 证书过期日期之后,所以可以修改 vCenter Server 的系统时间为 STS 证书过期前的时间临时让其服务正常运行并可以进入到 vSphere Web Client。经过多种方式对时间的修改(什么 NTP 时钟服务器同步、虚拟机系统时间同步了硬件时间、虚拟机系统时间由 VM-Tools 同步),发现 5.5 的 vCenter Server 的系统时间都没有改过来,后来通过在 vCenter Server 虚拟机的 VMX 配置文件里添加以下参数后终于成功修改,以下参数可以锁定 vCenter Server 虚拟机系统启动的时间,rtc.startTime 后面的值为时间戳,你可以使用 时间戳(Unix timestamp)转换工具 修改为 STS 证书时间过期前的时间。
tools.syncTime = "FALSE"
time.synchronize.continue = "FALSE"
time.synchronize.restore = "FALSE"
time.synchronize.resume.disk = "FALSE"
time.synchronize.shrink = "FALSE"
time.synchronize.tools.startup = "FALSE"
rtc.startTime = 1325376000
使用客户端工具登录到 ESXi 并导航到 vCenter Server 虚拟机所使用的存储目录,将 VMX 配置文件下载到本地(注意备份),将上面的修改后的配置参数添加到 VMX 配置文件中并保存,再上传到 vCenter Server 虚拟机的存储文件夹中覆盖原来的配置文件。重新启动 vCenter Server 后,服务启动过程无报错并运行正常。
注:由于修改了主机 vCenter 的 VMX 配置文件,后面更新完 STS 证书后,在重新启动 vCenter Server 之前需要重新把原来的配置文件还原回去,不然每次 vCenter 启动都会继承配置文件中的时间。
通过修改 vCenter Server 的时间,vCenter 系统服务正常启动后,可以正常登录到vSphere Web Client。注意,由于访问需要使用 Flash,需要客户端安装 vCenter Server 所支持的 Flash 版本并使用支持的浏览器,不然将无法访问。 通过 SSO 管理员用户登录到 vCenter Server 后,导航到系统管理->Single Sign-On->配置->证书,这里可以看到 STS 证书已过期。
6、现在回到第一个问题。STS 证书的更新可以在上图中的位置选择从本地导入证书文件并更新,不过需要通过命令手动生成新的 STS 证书并下载到本地。具体手动生成 STS 证书的方法可以参考 VMware vSphere 6.5 产品文档中的方法。
SSH 登录到 vCenter Server。
1)创建顶级目录以保存新证书并确认该目录的位置。
mkdir newsts
cd newsts
pwd
#resulting output: /root/newst
2)将 certool.cfg 文件复制到新目录中。
cp /usr/lib/vmware-vmca/share/config/certool.cfg /root/newsts
3)打开 certool.cfg 文件的副本并进行编辑,修改为本地 Platform Services Controller 的 IP 地址和主机名。国家/地区为必填字段且必须是两个字符,如以下示例所示。
#
# Template file for a CSR request
#
# Country is needed and has to be 2 characters
Country = US
Name = STS
Organization = ExampleInc
OrgUnit = ExampleInc Dev
State = Indiana
Locality = Indianapolis
IPAddress = 10.0.1.32
Email = chen@exampleinc.com
Hostname = homecenter.exampleinc.local
4)生成密钥。
/usr/lib/vmware-vmca/bin/certool --server localhost --genkey --privkey=/root/newsts/sts.key --pubkey=/root/newsts/sts.pub
5)生成证书。
/usr/lib/vmware-vmca/bin/certool --gencert --cert=/root/newsts/newsts.cer --privkey=/root/newsts/sts.key --config=/root/newsts/certool.cfg
6)将证书转换为 PK12 格式。
openssl pkcs12 -export -in /root/newsts/newsts.cer -inkey /root/newsts/sts.key -certfile /var/lib/vmware/vmca/root.cer -name "newstssigning" -passout pass:testpassword -out newsts.p12
7)将证书添加到 Java 密钥库 (JKS)。
/usr/java/jre-vmware/bin/keytool -v -importkeystore -srckeystore newsts.p12 -srcstoretype pkcs12 -srcstorepass testpassword -srcalias newstssigning -destkeystore root-trust.jks -deststoretype JKS -deststorepass testpassword -destkeypass testpassword
/usr/java/jre-vmware/bin/keytool -v -importcert -keystore root-trust.jks -deststoretype JKS -storepass testpassword -keypass testpassword -file /var/lib/vmware/vmca/root.cer -alias root-ca
使用 keytool -help
获取所有可用命令的列表。
8)出现提示时,键入 Yes
接受证书以将其添加到密钥库。
最后将生成的 STS 证书文件(root-trust.jks)通过 SFTP 下载到本地,然后参考下面的方法,将 STS 证书文件上传更新并重新启动 vCenter Server。注意上面证书设置的密码(testpassword),导入的时候可能需要验证。
7、通过修复 STS 证书过期问题后,在正确的时间上正常启动 vCenter Server 服务过程中没有相关错误,通过客户端也能正常访问 vCenter Server了。但是,使用查询功能时出现“无法连接到 Web 服务以执行查询。请验证 https://ip:10443 上是否正在运行“VMware VirtualCenter Management Webservices”服务”的错误提示。
vCenter Server 在之前自动更新 SSL 证书后,如 vCenter Inventory Service 等组件服务没有得到更新,可以通过 VMware KB 2054085 查看 vCenter Server 5.x 具有的组件服务列表以及服务如何停止、启动和重启。需要参考 VMware KB 2094888 取消注册服务,并按照 VMware KB 2037952 重新向 vCenter 注册服务。
SSH 登录到 vCenter Server。
1)进入到 register-hooks 组件注册目录。
cd /etc/vmware-sso/register-hooks.d
2)运行下面命令注销 vCenter Inventory Service 组件。注意 vCenter Server 的地址和用户名密码填入自己的。
./02-inventoryservice --mode uninstall --ls-server https://<FQDN of VCVA>:7444/lookupservice/sdk --user administrator@vsphere.local --password <Password>
3)如果命令执行成功,则会输出类似于下面的内容。
======
Intializing registration provider...
Getting SSL certificates for <FQDN of VCVA> :7444/lookupservice/sdk
Service with id "local:3576d0a7-e3db-4857-b0c1-9e289f95aa9c" is successfully unregistered
Return code is: Success
Intializing registration provider...
Getting SSL certificates for <FQDN of VCVA> :7444/lookupservice/sdk
Successfully deleted authenticated user
Return code is: Success
======
1)停止 vCenter Inventory Service 组件服务,备份数据库并修改数据库。
service vmware-inventoryservice stop
mv /storage/db/inventoryservice/data /storage/db/inventoryservice/data.old
/usr/lib/vmware-vpx/inventoryservice/scripts/ds-invoke.sh -Dvim.logdir=/var/log/vmware/vpx/inventoryservice com.vmware.vim.dataservices.CreateDb /storage/db/inventoryservice/data changeme default changeme
2)启动 vCenter Inventory Service 组件服务。
service vmware-inventoryservice start
3)将 vCenter Inventory Service 组件服务重新注册到 vCenter Server。注意 vCenter Server 的地址填入自己的。
/usr/lib/vmware-vpx/inventoryservice-registration/vcregtool.sh -Dvim.logdir=/var/log/vmware/vpx/inventoryservice-registration com.vmware.vim.dataservices.vcregtool.RegisterVC -action register -lookupserviceurl https://vcenter_fqdn:7444/lookupservice/sdk -isurl https://vcenter_fqdn:10443 -vcurl https://vcenter_fqdn/sdk/vimService -vccert /etc/vmware-vpx/ssl/rui.crt -vcprivkey /etc/vmware-vpx/ssl/rui.key -vcinstancecfg /etc/vmware-vpx/instance.cfg -vcendpointsdir /usr/lib/vmware-vpx/endpoints -vcextensionsdir /usr/lib/vmware-vpx/extensions
4)重新启动 VMware VirtualCenter Server Service 组件服务。
service vmware-vpxd restart
完成以上操作后,vCenter Server 连接使用正常。