0x01 前言

从7.0开始,vcenter及各个组件都应用严格的证书校验策略,一旦证书过期或不正确,将造成严重甚至致命的错误。单就VCSA而言,证书过期会导致自身的各个服务无法启动,首当其冲的是H5 GUI。

在证书过期前,VCSA会发出警告,只需要手动renew证书即可。如果日常不是使用VCSA管理虚拟机的话,非常容易忽略掉这个告警,比如使用vCloud及NSX-T管理虚拟机及网络的时候。

0x02 错误及影响

错误信息十分的不清晰,及其容易让人以为是帐户信息有误或者其他问题,比如:

An error occurred during authentication. Back to login screen

An error occurred while sending an authentication request to the vCenter Single Sign-On server - An error occurred when processing the metadata during vCenter Single Sign-On setup - null. Back to login screen

就上面2个错误信息来看,很难看出是证书问题。但出现第2个错误信息的时候,可以优先考虑证书异常,因为证书异常会导致SSO故障。针对第2个告警,除证书过期问题外,证书alternative name不匹配也会出现这个错误,alternative name不匹配主要会导致STS服务异常。

最明显的影响是无法通过H5 GUI登入VCSA,如果还有诸如NSX、vCloud或vRealize等服务,因为都依赖VCSA,所以都没法使用。如果NSX-V没启用CDO Mode,可能会影响SDN;vCloud因为无法与VCSA通讯,所有操作也不可用。

vSAN在VCSA故障的时候不会有影响,与此同时,正在运行的虚拟机和SDN都不会受到影响。但HA服务是不可用的,一旦出现主机故障,可能会导致极其严重的问题,需要争取在最短时间内恢复VCSA的功能。

0x03 信息确认

修复过程较为繁琐,可能会失败多次,在我实际操作过程中经常出现异常,在某些大型集群中尤为常见,因为VCSA的服务非常多。

在对VCSA进行操作前请关闭active、standby及witness虚拟机,并对active及standby虚拟机打快照。打快照这一步极其重要,这可以给自己留出回旋的余地。然后从这2台虚拟机中随机选一台开机,如果证书已经过期,那么applmgmt服务应该是无法启动的,请通过esxi host的console打开VCSA的窗口,使用root信息登入后执行以下命令强制关闭VCHA:

vcha-destroy -f

稍等片刻,VCSA会自动启动服务,使用以下命令确认applmgmt的启动情况,如果没启动则手动启动,其他服务忽略即可:

检查服务启动情况:
service-control --status

手动启动服务:
service-control --start applmgmtd

建议打开一个CMD或powershell窗口一直ping VCSA的IP或域名,启动上述服务后即可ping通VCSA的IP。5480端口也变为可用,但我们完全用不上这个WEB GUI。

接着使用SSH及root用户信息登入VCSA,继续使用esxi console也行,但使用SSH可以更方便地输入命令。继续使用上述的命令确认vmafd服务的启动情况,这服务极有可能处于未启动的状态:

service-control --start vmafdd

然后执行以下命令:

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;

这个命令会列出所有证书的过期时间:

[*] Store : TRUSTED_ROOTS
Alias : 28454db1f9db7c16abd129252d5617e8b697aded
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : machine
Alias : machine
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : vsphere-webclient
Alias : vsphere-webclient
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : vpxd
Alias : vpxd
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : vpxd-extension
Alias : vpxd-extension
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : hvc
Alias : hvc
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : data-encipherment
Alias : data-encipherment
            Not After : Jan  4 17:27:52 2031 GMT
[*] Store : APPLMGMT_PASSWORD
[*] Store : SMS
Alias : sms_self_signed
            Not After : Jan  9 17:34:16 2031 GMT
[*] Store : wcp
Alias : wcp
            Not After : Jan  9 17:26:02 2023 GMT
[*] Store : MACHINE_SSL_CERT
Alias : __MACHINE_CERT
            Not After : Jan 10 05:27:52 2023 GMT

可以看到wcp和__MACHINE_CERT的过期时间是2023年,在我写这篇文章前就已经过期并且修复了,所以才会有这篇文的。

确认证书确实过期后,再收集个很重要的信息:VCSA的IP或FQDN,这个信息主要用于签发证书,而证书中其他信息都不重要。使用以下命令获取VCSA的server name:

/usr/lib/vmware-vmafd/bin/vmafd-cli get-pnid --server-name localhost

在我的环境中是IP地址,如果在初始配置的时候使用域名,则返还的内容应该是域名。如果是IP,在后续签发证书的步骤会有需要注意的点,这部份内容在我找到的所有文档中均未提及。

还可以使用以下命令检查当前证书的Alternative name:

/usr/lib/vmware-vmafd/bin/vecs-cli entry list --store MACHINE_SSL_CERT --text | grep -A1 Alternative

0x04 签发证书

签发证书前请使用以下命令启动服务:

service-control --start --all

在证书已经过期的情况下,服务是无法全部启动的,可能会卡在启动vmware-vmon服务的时候,此时使用CTRL+Z中断即可:

然后执行以下命令使用certificate-manager签发并替换证书:

/usr/lib/vmware-vmca/bin/certificate-manager

如果和我一样,wcp和__MACHINE_CERT证书都已经过期,则需要使用8:reset all certificates:

这里我选择NO:

Do you wish to generate all certificates using configuration file : Option[Y/N] ? : n

输入帐号及密码后会询问是否使用certool.cfg中的信息,这个文件内的信息就是CSR的信息,具体路径在:

/usr/lib/vmware-vmca/share/config/certool.cfg

这是初始安装时留下的CSR信息,里面有些内容和实际不一样,因为初始化安装的时候被自定义信息覆盖了,所以不可以直接使用。在询问是否要reconfigure的时候请选择y:

如果VCSA使用IP而不是域名,则需要填写以下内容,否则留空:

Enter proper value for 'IPAddress' (Provide comma separated values for multiple IP addresses) [optional] : 192.168.1.1

以下内容按实际情况填写即可,不可留空:

Enter proper value for 'Hostname' (Provide comma separated values for multiple Hostname entries) [Enter valid Fully Qualified Domain Name(FQDN), For Example : example.domain.com] : 192.168.1.1

因为是自签发证书,所以其他信息不重要,直接回车即可。到最后输入y即可,该程序会自动生成并替换所有服务的证书。如果一切正常,则会看到以下信息:

如果Reset status不是100%,则说明失败,请回滚快照后重试。有些服务会出现Don’t update的信息,忽略即可,一般是NSX之类的服务。

成功后请使用“0x03 信息确认“部份中,确认VCSA server name及证书信息的命令确认相关信息,如果是IP地址,则信息应该如下:

root@localhost [ ~ ]# /usr/lib/vmware-vmafd/bin/vecs-cli entry list --store MACHINE_SSL_CERT --text | grep -A1 Alternative
            X509v3 Subject Alternative Name:
                email:[email protected], IP Address:192.168.1.1, DNS:192.168.1.1

DNS字段对使用IP作为server name的VCSA没有任何用处,务必确认Alternative name有IP Address字段,并且该字段的内容为VCSA的IP地址。

先使用reboot命令重启一遍VCSA,等待20分钟并使用以下命令确认服务的启动情况,如果有启动失败的服务先忽略:

service-control --status

Running:
applmgmt lookupsvc lwsmd observability observability-vapi pschealth vlcm vmafdd vmcad vmdird vmonapi vmware-analytics vmware-certificateauthority vmware-certificatemanagement vmware-cis-license vmware-content-library vmware-eam vmware-envoy vmware-hvc vmware-infraprofile vmware-perfcharts vmware-postgres-archiver vmware-rhttpproxy vmware-sca vmware-sps vmware-statsmonitor vmware-stsd vmware-topologysvc vmware-trustmanagement vmware-updatemgr vmware-vapi-endpoint vmware-vcha vmware-vdtc vmware-vmon vmware-vpostgres vmware-vpxd vmware-vpxd-svcs vmware-vsan-health vmware-vsm vsphere-ui vstats vtsdb wcp
Stopped:
vmcam vmware-imagebuilder vmware-netdumper vmware-pod vmware-rbd-watchdog

随后到以下知识库中下载用于修复STS服务的脚本并放置在任意目录中:

建议用sublime或其他编辑器打开,在VCSA /tmp目录中新建一个空文件并将fixsts.sh文件的内容粘贴到该空文件中,使用chmod +x赋予可执行权限,然后执行。期间会要求输入VCSA管理员的密码,输入后会自动调整STS服务证书。以下为上述知识库中的输出内容:

NOTE: This works on external and embedded PSCs
This script will do the following
1: Regenerate STS certificate
What is needed?
1: Offline snapshots of VCs/PSCs
2: SSO Admin Password
IMPORTANT: This script should only be run on a single PSC per SSO domain
==================================
Resetting STS certificate for vcsa1.gsslabs.org started on Fri May 22 14:39:40 UTC 2020

Detected DN: cn=vcsa1.gsslabs.org,ou=Domain Controllers,dc=vsphere,dc=local
Detected PNID: vcsa1.gsslabs.org
Detected PSC: vcsa1.gsslabs.org
Detected SSO domain name: vsphere.local
Detected Machine ID: ce510c87-35e6-444e-82f0-60a7527608a3
Detected IP Address: 192.168.0.51
Domain CN: dc=vsphere,dc=local
==================================
==================================

Detected Root's certificate expiration date: 2030 May 16
Detected today's date: 2020 May 22
==================================

Exporting and generating STS certificate

Status : Success
Using config file : /tmp/vmware-fixsts/certool.cfg
Status : Success

Enter password for [email protected]:
Amount of tenant credentials: 1
Exporting tenant and trustedcertchain 1 to /tmp/vmware-fixsts

Deleting tenant and trustedcertchain 1

Applying newly generated STS certificate to SSO domain
adding new entry "cn=TenantCredential-1,cn=vsphere.local,cn=Tenants,cn=IdentityManager,cn=Services,dc=vsphere,dc=local"

adding new entry "cn=TrustedCertChain-1,cn=TrustedCertificateChains,cn=vsphere.local,cn=Tenants,cn=IdentityManager,cn=Services,dc=vsphere,dc=local"

Replacement finished - Please restart services on all vCenters and PSCs in your SSO domain
==================================
IMPORTANT: In case you're using HLM (Hybrid Linked Mode) without a gateway, you would need to re-sync the certs from Cloud to On-Prem after following this procedure
==================================
==================================

如果出现错误信息,请重新排查,若无误则重启VCSA即可。

0x05 收尾

根据实际情况,需要到NSX中重新连接VCSA,这过程中会要求确认新证书指纹。如果Lookup Service URL报以下错误,请确认证书的Alternative name及STS证书情况:

NSX Management Service operation failed. ( Initialization of Admin Registration Service Provider failed. Root Cause: The SSL certificate of STS service cannot be verified ).

如果报以下错误则检查NSX-V与VCSA的时间差异,建议使用NTP服务同步时间:

Provided credentials are not valid

vCloud的部份也需要重新添加VCSA,在Infrastructure Resources –> vCenter Server Instances中点击对应的VCSA并EDIT,输入管理员密码并接受新证书即可。

最后且最重要的一步:重建VCHA。

0x06 结语

VCSA极其重要,是整套集群最核心的部份。日常要多加留意,尤其是大型和特大型集群,一旦崩溃则有可能导致公司倒闭。还有一点很重要:在对VCSA进行任何操作前,务必要先做快照。

相关文档: