TL;DR: Тут описано продление внутренних сертификатов VMware vCenter Server до 10 лет с корректными данными в CN, а также vcert, lsdoctor и vdt.
Наверное все администраторы VMware vSphere слышали про проблему с истечением двухлетнего сертификата STS, который используется для выпуска SAML-токенов и от него зависит взаимная аутентификация всех сервисов внутри vCenter Server.
Похоже разработчкики решили внедрить рекомендации CA/B Forum по сокращению сроков действия сертификатов, но слишком широко применили политику.
Пострадавшие запускали fixsts и certificate-manager из KB76719 для восстановления доступа к инфраструктуре и забывали об этом ещё на 2 года.
Но решение оказалось неполным и не совсем корректным:
Новые сертификаты имеют лишние поля в CN и срок действия в 2 года вместо 10 лет, как после чистой установки.
При обновлениях проблема остаётся и начиная с vSphere 7.0 сертификаты solution users скрыли из интерфейса, так что понять о необходимости продления можно лишь из неинформативного аларма.
В vCenter Server 7.0 можно продлить срок действия STS до срока действия VMCA в Administration > Certificate Management > Refresh with vCenter Certificate.
А вот продление solution users прямо нигде не сказано, зато есть куча статей с рекомендацией использовать VMCA, который "не надо трогать, ведь он сам следит за сертификатами".
Решение оказалось в логе скрипта установки /var/log/firstboot/soluser_firstboot.py_<PID>_stdout.log, который использует недокументированные ключ certool --genCIScert для подписи сертификатов и навело на пример в KB88548.
Тут можно было закончить, но на всякий случай опишу алгоритм действий с дополнительными шагами для остальных сервисов.
Продление сертификатов solution users
Обязательно делаем снепшот выключенной ВМ с vCenter Server, а лучше вначале потренироваться на клоне.
Получаем список сертификатов для продления (все они перечислены в KB2111411):
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
Hidden text
STORE MACHINE_SSL_CERT
Alias : __MACHINE_CERT
Not After : Jul 12 15:30:07 2024 GMT
STORE TRUSTED_ROOTS
Alias : 7f37edfb22a0b3226c4045bdd0dd368f5ce548e1
Not After : Jul 31 12:05:16 2030 GMT
STORE TRUSTED_ROOT_CRLS
Alias : ec2c82996b240de563ff338dc7eefb59b5ccdb8c
STORE machine
Alias : machine
Not After : Aug 5 11:56:26 2022 GMT
STORE vsphere-webclient
Alias : vsphere-webclient
Not After : Aug 5 11:56:27 2022 GMT
STORE vpxd
Alias : vpxd
Not After : Aug 5 11:56:27 2022 GMT
STORE vpxd-extension
Alias : vpxd-extension
Not After : Aug 5 11:56:28 2022 GMT
STORE SMS
Alias : sms_self_signed
Not After : Aug 5 12:10:43 2030 GMT
STORE STS_INTERNAL_SSL_CERT
Alias : __MACHINE_CERT
Not After : Jul 12 15:30:07 2024 GMT
STORE APPLMGMT_PASSWORD
STORE data-encipherment
Alias : data-encipherment
Not After : Feb 2 14:20:38 2023 GMT
STORE hvc
Alias : hvc
Not After : Jul 31 12:05:16 2030 GMT
STORE wcp
Alias : wcp
Not After : Jul 31 12:05:16 2030 GMT
STORE BACKUP_STOREПри обновлении до 7.0 сертификаты новых сервисов (hvc и wcp) имеют правильный срок действия. Нам надо продлить machine, vsphere-webclient, vpxd, vpxd-extension и data-encipherment.
Экспортируем старые закрытый и открытый ключи:
/usr/lib/vmware-vmafd/bin/vecs-cli entry getcert --store machine --alias machine --output /root/backup/machine.crt
/usr/lib/vmware-vmafd/bin/vecs-cli entry getkey --store machine --alias machine --output /root/backup/machine.key
Удаляем их из хранилища и обновляем данные в VMDIR:
/usr/lib/vmware-vmafd/bin/vecs-cli entry delete -y --store machine --alias machine
/usr/lib/vmware-vmafd/bin/vecs-cli force-refresh
Подписываем новый сертификат, указав необходимые поля (CN и SAN), он будет автоматически добавлен в одноимённое хранилище VECS:
/usr/lib/vmware-vmca/bin/certool --genCIScert --privkey=/root/vmca/machine.key --cert=/root/vmca/machine.crt --Name=machine --FQDN=vcenter.mydomain.tld
Повторяем пункты с 3 по 5 для оставшихся сервисов vsphere-webclient, vpxd, vpxd-extension и data-encipherment. У последнего есть свой ключ --dataencipherment, который что-то делает в примере из KB, поэтому не забудьте его указать.
Обновляем сертификаты расширений по KB2112577.
Скачиваем lsdoctor из KB80469 и чиним привязки:
python lsdoctor.py --solutionusers
python lsdoctor.py --stalefixПерезапускаем сервисы командой service-control --stop --all && service-control --start --all.
Прогоняем vSphere Diagnostic Tool и проверяем работу vCenter Server.
Общая схема работы VMCA неплохо описана в документации, также могут пригодиться инструкции из KB2111411.
Продление сертификата STS в vCenter 6.x
Для продления сертификата STS до 10 лет проще всего обновить vCenter Server до версии 7.0, но если вы застряли на версии 6.x, то можете попробовать такой способ:
Сделайте офлайн снепшот VCSA!
Получите закрытый ключ и сертификат из VMDIR:
/opt/likewise/bin/ldapsearch -h localhost -p 389 -b "cn=vsphere.local,cn=Tenants,cn=IdentityManager,cn=Services,dc=vsphere,dc=local" -D "cn=administrator,cn=users,dc=vsphere,dc=local" -w "<пароль>" "(objectclass=vmwSTSTenantCredential)"
Сохраните их в формате PEM добавив заголовки "BEGIN PRIVATE KEY" или "BEGIN CERTIFICATE".
Подпишите новый сертификат с ключом --genCIScert вместо --gencert из документации:
/usr/lib/vmware-vmca/bin/certool --genCIScert --privkey=/root/sts.key --cert=/root/sts.crt --Name=ssoserverSign --FQDN=<VCSA FQDN>
Замените сертификат по инструкции через старый флешевый vSphere Web Client.
Удалите промежуточное хранилище в VECS, которое было создано в пункте 2:
/usr/lib/vmware-vmafd/bin/vecs-cli store delete --name ssoserverSign
Проверьте, что всё работает корректно и при необходимости исправьте ошибки или откатитесь на резервную копию.
Бонус: подчищаем хвосты от обновлений
После некоторых операций остаются лишние хранилища и сертификаты в VECS, которые можно убрать для упрощения обслуживания. К ним относятся:
Старые сертификаты доверенных CA, их удаление описано в KB2146011.
Старые сертификаты в BACKUP_STORE для отката в certificate-manager можно удалить скриптом из KB82560.
Хранилище с именем <vCenter FQDN> появляется при переименовании vCenter Server Appliance через VAMI, можно удалить после перезагрузки.
STS_INTERNAL_SSL_CERT из KB76144 остаётся при обновлении с vCenter 6.0, перед удалением надо изменить хранилище на MACHINE_SSL_CERT в конфигурации vmware-sts:
sed -i 's/STS_INTERNAL_SSL_CERT/MACHINE_SSL_CERT/' /usr/lib/vmware-sso/vmware-sts/conf/server.xml
/usr/lib/vmware-vmafd/bin/vecs-cli store delete --name STS_INTERNAL_SSL_CERT
service-control --restart vmware-stsd
Надеюсь инструкция будет кому-то полезна и потеряет актуальность с осенним релизом vSphere 8 или обновлением lsdoctor, но пока лучших вариантов не нашлось.
Обновление от 09.08.2022
Оказывается у GSS есть навороченный скрипт vCert.sh (зеркало) для починки всего связанного с сертификатами, кроме продления solution users до 10 лет.
Обновление от 02.11.2022
Новые баги в комментариях.