どうも、Tです。
vSphere7の証明書周りを調べてみて、マシンSSL証明書が切れるとvCenter関連のサービスが起動しなくなることを確認しました。その状態から回復させる方法を試したので備忘録です。
前回vSphere Certificate ManagerのOption4でを使って確認しましたので、今回はOption8を使用してどうなるか確認します。
目次
ここでの結論
- 証明期限切れから即時復旧であれば、この手順で復旧できる
- 復旧後にvCLSの公式情報が2021年8月時点ではないためVMwareサポートへ確認が必要
- ソリューションユーザー証明書が置き換わるため、周辺コンポーネント(VDI、バックアップ、NSXなどなど)別途対応が必要
- ソリューションユーザー証明書が10年期限から2年期限に置き換わるのはいただけない
–2021年8月13日追記 ここから–
ちなみに、Option3.Replace Machine SSL certificate with VMCA CertificateでマシンSSL証明書のみを更新するとソリューションユーザー証明書は10年保持されますが、ソリューションユーザー証明書の1つであるwcp証明書が2年のままになります。
wcp証明書が切れいている場合も問題ができることを確認できているので、即時復旧を望む場合、Option8を利用するのがよいと思います。
–2021年8月13日追記 ここまで–
やりたいこと
「【vSphere7.0u2】証明書の有効期限はどうなったのか。マシンSSL証明書が切れるとどうなるか。」でマシンSSL証明書が切れた状態で、正常に使えるようにするリカバリできるのか?を試します。
VMware認証局(VMCA)の証明書を使用して、マシンSSL証明書とソリューションユーザー証明書を再作成して置き換える方法です。
新しい自己署名 VMware 認証局の証明書を使用して vSphere 6.x/7.x の証明書を再生成する (2112283)
この記事では、VMware Certificate Authority (VMCA) で新しい自己署名証明書を使用して vSphere 6.x/7.x の証明書を再生成する手順を説明します。
注:このプロセスは、証明書の期限が切れたシナリオを迅速にリカバリするのに役立ちます。
なお、上記のKBを実行するにあたりSTS証明書の有効期限内である必要があります。
注: STS 証明書の有効期限が失効している場合、以下の手順での証明書の置き換えは失敗しロールバックされます。STS 証明書の有効期限を確認する KB を参照し、必要な場合は失効した STS 証明書を置換します。
下記のドキュメントを見つけたのでOption8を確認します。
マシン SSL 証明書とソリューションユーザ証明書が期限切れの場合、証明書の置き換えにはオプション 8 (証明書のリセット)を使用してください。
環境
検証環境は、先ほど紹介した記事の続きになります。
- vCenterServer:7.0.2 17958471
- vSphere ESXi: 7.0.2 17867351
VMware 認証局(VMCA)の証明書から再作成(オプション8)
vcsaにSSH接続し、shellモードで下記コマンドを実行します。certificate-managerコマンドは、証明書周りを操作するためのツールになります。
/usr/lib/vmware-vmca/bin/certificate-manager
今回は、「8. Reset all Certificates 」を使用するため、画像に沿ってOptionに8を指定しSSOアカウントとパスワードを入力します。
この作業を始めて行うときはVMCAから発行される証明書定義に必要な項目を入力していきます。
Please configure certool.cfg with proper values before proceeding to next step. Press Enter key to skip optional parameters or use Default value. Enter proper value for 'Country' [Default value : US] : Enter proper value for 'Name' [Default value : CA] : Enter proper value for 'Organization' [Default value : VMware] : Enter proper value for 'OrgUnit' [Default value : VMware Engineering] : Enter proper value for 'State' [Default value : California] : Enter proper value for 'Locality' [Default value : Palo Alto] : Enter proper value for 'IPAddress' (Provide comma separated values for multiple IP addresses) [optional] : Enter proper value for 'Email' [Default value : email@acme.com] : 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] : testvcsa.testdev.lab Enter proper value for VMCA 'Name' :testvcsa.testdev.lab You are going to regenerate Root Certificate and all other certificates using VMCA Continue operation : Option[Y/N] ? : Y
わかりにくいので下記に記載しました。注意点としては、「Hostname」と「VMCA ‘Name’」には、vcsaのFQDNを入力してください。ショートネームやIPアドレスは不可です。
「Continue operation : Option[Y/N] ? : Y」の実行後、下記のように処理が実施されるので待ちます。
「Status : 100% Completed [All tasks completed successfully]」で処理が完了します。サービスの再起動も行ってくれました。(vcsaの再起動がかかってるっぽい)
検証環境では30分弱ほどかかりました。非力な環境でしていますが、本番環境でも10分以上はかかりそうですので気長に待ちましょう。
先ほどFQNDで記載した「Hostname」と「VMCA ‘Name’」は、PNIDとマッチする必要があるものです。PNIDは、下記のコマンドで確認できました。
PNIDとホスト名があっていることを確認しておきましょう。
/usr/lib/vmware-vmafd/bin/vmafd-cli get-pnid --server-name localhost
証明書再作成後の確認
ログイン確認
ログインが行えるようになりました。証明書のステータスについては後述。
証明書確認(vSphere Clientから)
再生成で置き換えられたことがわかります。検証のため現在は未来時間2023年8月16日となっていますので、マシンSSL証明書は2年後の2025年8月になっています。
比較までに下記が検証している2021年8月10日時点の証明書の状態です。
証明書確認(vcsaコマンドラインから)
vcsaへログインして、shellモードで下記コマンドを実行します。
for i in $(/usr/lib/vmware-vmafd/bin/vecs-cli store list); do echo STORE $i; /usr/lib/vmware-vmafd/bin/vecs-cli entry list --store $i --text | egrep "Alias|Not After"; done
再生成で置き換えられたことがわかります。検証のため現在は未来時間2023年8月16日となっていますので、マシンSSL証明書とwcpは2年後の2025年8月になっています。
ここで誤算なのがもともと2031年まで有効なvpxdなどが再作成により2年の短い証明書で置き換えられています。これはよろしくない・・・・。
比較までに下記が検証している2021年8月10日時点の証明書の状態です。
その他問題
証明書エラーが消えないときの解決方法
証明書エラーが消えません。「緑にリセット」で手動で消してもvCenterを再起動すると表示されます。
証明書の置き換えの際に、VECS(VMware Endpoint 証明書ストア)にBACKUP_STOREが作成されバックアップ用の領域に期限切れの証明書があるためです。下記のコマンドを実行して、BACKUP_STOREから期限切れの証明書を削除しました。
有効期限の監視先ストアとコマンドの詳細は下記KBをご確認ください。
/usr/lib/vmware-vmafd/bin/vecs-cli entry delete --store BACKUP_STORE --alias <Alias Name> -y
削除後に、vcsaを再起動すると表示されなくなりました。
vCLSが動かないときの解決方法
Retreatモードを有効にしてもvCLSがデプロイされませんでした。
クラスタで下記のエラーが表示されます。詳細をクリックすると下記KBが表示されます。
/var/log/vmware/wcp/wcpsvc.logログを見ると下記のようなエラーが定期的に出力されています。
2023-08-16T06:11:20.985Z error wcp [clustersvc/monitor.go:215] [opID=vCLS] Failed to get EAM agencies: ServerFaultCode: EAM is still loading from database. Please try again later. 2023-08-16T06:11:20.985Z error wcp [clustersvc/monitor.go:113] [opID=vCLS] Unable to collect information for cluster agencies: ServerFaultCode: EAM is still loading from database. Please try again later. 2023-08-16T06:11:20.985Z error wcp [clustersvc/monitor.go:94] [opID=vCLS] EAM monitor encountered error: ServerFaultCode: EAM is still loading from database. Please try again later. 2023-08-16T06:11:21.002Z error wcp [eamlib/lister.go:86] [opID=EAMAgent] Failed to get EAM agencies. Err ServerFaultCode: EAM is still loading from database. Please try again later. 2023-08-16T06:11:21.002Z error wcp [informer/informer.go:129] [opID=EAMAgent] Failed to list EAMAgent. Err ServerFaultCode: EAM is still loading from database. Please try again later.
/var/log/vmware/eam/eam.logログを見ると下記のようなエラーが定期的に出力されています。
2023-08-16T06:13:33.225Z | ERROR | vlsi | DispatcherImpl.java | 450 | Internal server error during dispatch com.vmware.vim.binding.eam.fault.EamServiceNotInitialized: EAM is still loading from database. Please try again later. at
上記のエラーとvCLSと直接関連する公式情報は2021年8月時点ではありませんが、vCLSはwcpとeamで管理されているので問題が起こっていそうだなと調べると・・・
下記のナレッジがありました。ソリューションユーザー証明書が更新されたときにEAMの証明書が自動的に更新できないことが原因とのことです。
This issue is due to the certificate manager utility being unable to automatically update the EAM certificate when solution user certificates are updated. WCP requires EAM to be functional in order to start.
ということで、手順に従ってEAMの証明書を更新してきます。
ユーザー証明書とキーを取得します。
root@testvcsa [ / ]# mkdir /certificate root@testvcsa [ / ]# /usr/lib/vmware-vmafd/bin/vecs-cli entry getcert --store vpxd-extension --alias vpxd-extension --output /certificate/vpxd-extension.crt root@testvcsa [ / ]# /usr/lib/vmware-vmafd/bin/vecs-cli entry getkey --store vpxd-extension --alias vpxd-extension --output /certificate/vpxd-extension.key
EAMの証明書を更新します。vcsaのホスト名とSSOアカウントのドメイン名は適時読み替えてください。KBではvcsaホスト名をlocalhostですが、確実に失敗するのでFQDNを入れてください。
root@testvcsa [ / ]# python /usr/lib/vmware-vpx/scripts/updateExtensionCertInVC.py -e com.vmware.vim.eam -c /certificate/vpxd-extension.crt -k /certificate/vpxd-extension.key -s testvcsa.testdev.lab -u Administrator@vsphere.local
下記のような出力が得られます。
Password to connect to VC server for user="Administrator@vsphere.local": 2023-08-16T06:23:43.824Z Updating certificate for "com.vmware.vim.eam" extension 2023-08-16T06:23:44.581Z Successfully updated certificate for "com.vmware.vim.eam" extension Traceback (most recent call last): File "/usr/lib/vmware-vpx/scripts/updateExtensionCertInVC.py", line 175, in <module> update_extension_cert_in_VC() File "/usr/lib/vmware-vpx/scripts/updateExtensionCertInVC.py", line 163, in update_extension_cert_in_VC sessionMgr = si.content.sessionManager File "/usr/lib/vmware/site-packages/pyVmomi/VmomiSupport.py", line 577, in __call__ return self.f(*args, **kwargs) File "/usr/lib/vmware/site-packages/pyVmomi/VmomiSupport.py", line 382, in _InvokeAccessor return self._stub.InvokeAccessor(self, info) File "/usr/lib/vmware/site-packages/pyVmomi/StubAdapterAccessorImpl.py", line 42, in InvokeAccessor return self.InvokeMethod(mo, info, (prop, )) File "/usr/lib/vmware/site-packages/pyVmomi/SoapAdapter.py", line 1525, in InvokeMethod conn.request('POST', self.path, req, headers) File "/usr/lib/python3.7/http/client.py", line 1277, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.7/http/client.py", line 1323, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/lib/python3.7/http/client.py", line 1272, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.7/http/client.py", line 1032, in _send_output self.send(msg) File "/usr/lib/python3.7/http/client.py", line 972, in send self.connect() File "/usr/lib/python3.7/http/client.py", line 1447, in connect server_hostname=server_hostname) File "/usr/lib/python3.7/ssl.py", line 423, in wrap_socket session=session File "/usr/lib/python3.7/ssl.py", line 870, in _create self.do_handshake() File "/usr/lib/python3.7/ssl.py", line 1139, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'sdkTunnel'. (_ssl.c:1076)
サービスの停止と起動を行います。サービス再起動する前にvCLSのデプロイが始まったのでこれが必要なのか半信半疑ですが、一応KBにのっとるということで・・・。
root@testvcsa [ / ]# service-control --stop vmware-eam Operation not cancellable. Please wait for it to finish... Performing stop operation on service eam... Successfully stopped service eam root@testvcsa [ / ]# service-control --start --all Operation not cancellable. Please wait for it to finish... Performing start operation on service lwsmd... Successfully started service lwsmd Performing start operation on service vmafdd... Successfully started service vmafdd Performing start operation on service vmdird... Successfully started service vmdird Performing start operation on service vmcad... Successfully started service vmcad Performing start operation on profile: ALL... Successfully started profile: ALL. Performing start operation on service observability... Successfully started service observability Performing start operation on service vmware-vdtc... Successfully started service vmware-vdtc Performing start operation on service vmware-pod... Successfully started service vmware-pod
EAMの証明書更新をした際に下記のようなエラーっぽいメッセージが表示されます。
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for ‘sdkTunnel’. (_ssl.c:1076)
下記のナレッジによると「Successfully updated certificate for “com.vmware.vim.eam” extension」が出力されているなら無視してよいということです。
In certain situations, you might receive the error “certificate verify failed: Hostname mismatch, certificate is not valid for ‘sdkTunnel'”. This error can be safely ignored if you are getting the error after the message “Successfully updated certificate for “com.vmware.vim.eam” extension” as this message confirms that Extension certificate updated successfully with vCenter Server.
ちなみに、上記のナレッジには下記のようにEAMの証明書の自動更新は6.0U1b以降で解決してるけど、手順自体はは6.xと7.xでも使えるよという煮え切らない説明がされています・・・・。
Certificate Manager automatically updates the certificate for extensions like com.vmware.vim.eam (EAM), com.vmware.rbd (Autodeploy) from vCenter Server 6.0 U1b onwards. However, below steps can be tried on any vCenter Server 6.x or 7.x versions if you are seeing the error messages mentioned in Symptoms section
ともあれ、正常にvCLSが動くようになりました。
参考
まとめ
STS署名証明書以外はすべて置き換える形になるため、vSphereと連携するコンポーネント(バックアップ、VDI関連など)すべてで何かしら対処が必要になるので、結構シビアな手法になりそうです。