之前幫客戶處理了一個因證書過期導致 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 知識庫,但是在這之前的版本可就沒那麼方便了!
- CertificateStatusAlarm - There are certificate that expired or about to expire/Certificate Status Change Alarm Triggered on VMware vCenter Server
- Certificate alarm - Clearing BACKUP_STORES certificates in the VCSA
- "Signing certificate is not valid" error in VCSA 6.5.x/6.7.x and vCenter Server 7.0.x ,8.0.x.
- How to Replace Expired Certificates on vCenter Server using Fixcerts Python Script
- How to replace an expired data-encipherment certificate on vCenter Server
- How to use vSphere Certificate Manager to Replace SSL Certificates
由於無法登入 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-ssoykeys/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。
- 登出 vCenter Inventory Service 元件
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
======
- 重新註冊 vCenter Inventory Service 元件
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 連線使用正常。