Critical Notification : Failed to refresh vCenter ( Error Code : RBK20100039 )

 Rubrik Japan 社の10周年を祝うユーザー会にお招きいただき,「やっぱり Rubrik 最高!」と大いに盛り上がったのは,つい先週金曜の夜のこと. まさかその余韻のまま,不穏なアラートとともに週明けを迎えることになるとは思いもよりませんでした.


 Root CA 証明書ってそんなに短命な筈ないよね?とモヤモヤしつつも,とりあえず vCenter の証明書ストアである VECS(VMware Certificate Store)をワンライナーで確認します.

root@VCSA [ ~ ]# 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 : MACHINE_SSL_CERT
Alias : __MACHINE_CERT
            Not After : Apr 18 13:54:13 2028 GMT
[*] Store : TRUSTED_ROOTS
Alias : b743ab41b7729aef9a2dbaa8fb075e5ea6063803
            Not After : Apr 18 10:10:25 2034 GMT
(以下略)

 予想通り,TRUSTED_ROOTS は 2034 年 4 月 18 日まで有効です.ただ,MACHINE_SSL_CERT を見る限り,2 年の有効期限が切れて,この証明書が更新されたことが今回のエラーのトリガーになったようなのです.


 RSC 経由で Cluster に接続してみると,該当の vCenter は Connection Status が "Disconnected" になっています.


 Disconnected では何も出来ないので,"Edit vCenter" から設定内容を確認してみます.


 すると,驚いたことに /var/lib/vmware/vmca/root.cer とは別 ( 5 行目までは同じ ) の証明書が保存されているではありませんか!


 vCenter の方で確認すると,Root CA 証明書は 2034 年 4 月 18 日 まで有効と表示されます.

root@VCSA [ ~ ]# /usr/lib/vmware-vmafd/bin/vecs-cli entry list --store TRUSTED_ROOTS --text | grep -ie "Alias" -ie "Not Before" -ie "Not After"
Alias : b743ab41b7729aef9a2dbaa8fb075e5ea6063803
            Not Before: Apr 20 10:10:25 2024 GMT
            Not After : Apr 18 10:10:25 2034 GMT

 証明書ファイルのタイムスタンプは 2024 年 4 月 23 日になっています.

root@VCSA [ ~ ]# ls -la /var/lib/vmware/vmca/root.cer
-rw-r--r--. 1 vmcad-user lwis 1778 Apr 23  2024 /var/lib/vmware/vmca/root.cer



 2 年も前なので正確な日時は覚えていないため,ログを参照してみます.vCenter ( 当時の Version は 8.0.2.00300 ) をデプロイした際に,ドメインと FQDN の設定後に今の root.cer が VECS に import された事は確認できます (/var/log/firstboot/vmafd-firstboot.py_XXXXX_stdout.log より).

2024-04-23T10:10:25.173Z  Starting the First boot for VMCA
2024-04-23T10:10:25.173Z  Running Self CA Command
2024-04-23T10:10:25.173Z  Running command: ['/usr/lib/vmware-vmca/bin/certool', '--selfca', '--config=/usr/lib/vmware-vmca/share/config/certool.cfg', '--server=VCSA_FQDN', '--srp-upn=Administrator@
DOMAIN.local']
2024-04-23T10:10:25.704Z  Running command: ['/usr/lib/vmware-vmca/bin/certool', '--viewcrl', '--crl=/var/lib/vmware/vmca/vmca.crl', '--server=VCSA_FQDN', '--srp-upn=Administrator@DOMAIN.local']
2024-04-23T10:10:25.724Z  crl is generated
2024-04-23T10:10:25.724Z  In Post Init Phase
2024-04-23T10:10:25.724Z  Running command: ['/usr/lib/vmware-vmafd/bin/vmafd-cli', 'refresh-site-name']
2024-04-23T10:10:25.739Z  Successfully refreshed site name.
2024-04-23T10:10:25.739Z  Importing VMCA root cert to VECS.



 さて,対策はもうお気付きかと思いますが,正しい root.cer の中身を RSC の "Edit vCenter" 画面で Copy & Paste して "UPDATE" ボタンをクリックするだけです.これで Connection Status は "Connected" に戻ります.


 とりあえず問題は解決したのですが,モヤモヤが解消しないので,未登録の vCenter を新規で追加して,RSC 側に登録されていた証明書を探ってみることにしました.自動登録された証明書の内容で .cer ファイルを作成し,フィンガープリント(下の値はサンプルです)を確認します.

% openssl x509 -in root.cer -noout -fingerprint -sha1
sha1 Fingerprint=D7:D9:36:26:53:71:20:9D:16:7C:77:ED:44:D8:51:E4:9C:18:68:F8



 vCenter Server 側で VECS ストア全体をフルスキャンして,このフィンガープリントにマッチするものがあるか確認します..cer ファイルのフィンガープリントを TARGET_FINGERPRINT とかの変数に格納して,以下のようなワンライナーで探索します.

for store in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list | grep -v TRUSTED_ROOT_CRLS); do
    echo "Checking Store: $store"
    # 各ストアのエントリをループ
    for alias in $(/usr/lib/vmware-vmafd/bin/vecs-cli entry list --store $store | grep "Alias :" | awk '{print $3}'); do
        FINGERPRINT=$(/usr/lib/vmware-vmafd/bin/vecs-cli entry getcert --store $store --alias $alias | openssl x509 -noout -fingerprint -sha1 | cut -d'=' -f2)
        if [ "$FINGERPRINT" == "$TARGET_FINGERPRINT" ]; then
            echo "🔥 FOUND IT! Store: $store, Alias: $alias"
        fi
    done
done



 すると,なんと!マッチしたのは MACHINE_SSL_CERT ( 苦笑 ).

Checking Store: MACHINE_SSL_CERT
🔥 FOUND IT! Store: MACHINE_SSL_CERT, Alias: __MACHINE_CERT
Checking Store: TRUSTED_ROOTS
Checking Store: machine
Checking Store: vsphere-webclient
(以下略)



 VECS から MACHINE_SSL_CERT の証明書をファイルとして取り出すには vecs-cli コマンドを使います (/tmp の下に machine_ssl.cer として出力).

root@VCSA [ ~ ]# /usr/lib/vmware-vmafd/bin/vecs-cli entry getcert --store MACHINE_SSL_CERT --alias __MACHINE_CERT --output /tmp/machine_ssl.cer



 Blog ネタとしてあえて目視比較にしてみましたが,diff で確認するのが良いでしょう.紛れもなく Machine SSL 証明書です.RSC の Web UI では一見 Root CA 証明書が保存されるように思えますが,ここで自動取得されていたのは Machine SSL 証明書でした.エラーが出たタイミングとも合致するので漸く納得です.



 今回はエラー発動の原因が特定できたので,モヤモヤも解消し,RSC に vCenter を登録する際は Root CA 証明書を明示的に追加すべしとの教訓を得られました (苦笑).