TL;DR: Тут описано продление внутренних сертификатов VMware vCenter Server до 10 лет с корректными данными в CN, а также lsdoctor и vdt.

Наверное все администраторы VMware vSphere слышали про проблему с истечением двухлетнего сертификата STS, который используется для выпуска SAML-токенов и от него зависит взаимная аутентификация всех сервисов внутри vCenter Server.

Похоже разработчкики решили внедрить рекомендации CA/B Forum по сокращению сроков действия сертификатов, но слишком широко применили политику.

Пострадавшие запускали fixsts и certificate-manager из KB76719 для восстановления доступа к инфраструктуре и забывали об этом ещё на 2 года.

Но решение оказалось неполным и не совсем корректным:

  1. Новые сертификаты имеют лишние поля в CN и срок действия в 2 года вместо 10 лет, как после чистой установки.

  2. При обновлениях проблема остаётся и начиная с 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

  1. Обязательно делаем снепшот выключенной ВМ с vCenter Server, а лучше вначале потренироваться на клоне.

  2. Получаем список сертификатов для продления (все они перечислены в 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.
    Также в списке может быть хранилище с fqdn вашего сервера, которое появилось при его переименовании через VAMI, оно не используется и его можно удалить.

  3. Экспортируем старые закрытый и открытый ключи:
    /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

  1. Удаляем их из хранилища и обновляем данные в VMDIR:
    /usr/lib/vmware-vmafd/bin/vecs-cli entry delete -y --store machine --alias machine
    /usr/lib/vmware-vmafd/bin/vecs-cli force-refresh

  1. Подписываем новый сертификат, указав необходимые поля (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

  1. Повторяем пункты с 3 по 5 для оставшихся сервисов vsphere-webclient, vpxd, vpxd-extension и data-encipherment. У последнего есть свой ключ --dataencipherment, который что-то делает в примере из KB, поэтому не забудьте его указать.

  2. Обновляем сертификаты расширений по KB2112577.

  3. Скачиваем lsdoctor из KB80469 и чиним привязки:
    python lsdoctor.py --solutionusers
    python lsdoctor.py --stalefix

  4. Перезапускаем сервисы командой service-control --stop --all && service-control --start --all.

  5. Прогоняем vSphere Diagnostic Tools и проверяем работу vCenter Server.

Общая схема работы VMCA неплохо описана в документации, также могут пригодиться следующие статьи в KB:

Checking Expiration of STS Certificate on vCenter Servers (79248)
"Signing certificate is not valid" error in VCSA 6.5.x,6.7.x or vCenter Server 7.0.x (76719)
"Failed to check VMware STS. The SSL certificate of STS service cannot be verified" while upgrading VCSA from 6.5 to 6.7/7.0 (76144)
Manually reviewing certificates in VMware Endpoint Certificate Store for vSphere 6.x and 7.x (2111411)
Removing Expired CA Certificates from the TRUSTED_ROOTS store in the VMware Endpoint Certificate Store(VECS) (2146011)
Clearing BACKUP_STORES certificates in the VCSA via shell script (82560)

Бонус: продление сертификата STS в vCenter 6.x

Для продления сертификата STS до 10 лет проще всего обновить vCenter до версии 7.0, но если вы застряли на версии 6.x, то можете попробовать такой способ:

  1. Сделайте офлайн снепшот VCSA!

  2. Получите закрытый ключ и сертификат из 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)"

  3. Сохраните их в формате PEM добавив заголовки "BEGIN PRIVATE KEY" или "BEGIN CERTIFICATE".

  4. Подпишите новый сертификат с ключом --genCIScert вместо --gencert из документации:
    /usr/lib/vmware-vmca/bin/certool --genCIScert --privkey=/root/sts.key --cert=/root/sts.crt --Name=ssoserverSign --FQDN=<VCSA FQDN>

  5. Замените сертификат по инструкции через старый флешевый vSphere Web Client.

  6. Удалите промежуточное хранилище в VECS, которое было создано в пункте 2:
    /usr/lib/vmware-vmafd/bin/vecs-cli store delete --name ssoserverSign

Надеюсь инструкция будет кому-то полезна и потеряет актуальность с осенним релизом vSphere 8 или обновлением lsdoctor, но пока лучших вариантов не нашлось.

Комментарии (1)


  1. navion Автор
    29.07.2022 19:39

    Не думал, что новый редактор такой неудобный, прошу прощения за корявые листинги. Надеюсь ни у кого не пойдет кровь из глаз.