Pull to refresh

Продлеваем сертификаты vCenter правильно

Reading time5 min
Views16K

TL;DR: Тут описано продление внутренних сертификатов VMware vCenter Server до 10 лет с корректными данными в CN, а также vcert, 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.

  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 Tool и проверяем работу vCenter Server.

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

Продление сертификата STS в vCenter 6.x

Для продления сертификата STS до 10 лет проще всего обновить vCenter Server до версии 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

Проверьте, что всё работает корректно и при необходимости исправьте ошибки или откатитесь на резервную копию.

Бонус: подчищаем хвосты от обновлений

После некоторых операций остаются лишние хранилища и сертификаты в VECS, которые можно убрать для упрощения обслуживания. К ним относятся:

  1. Старые сертификаты доверенных CA, их удаление описано в KB2146011.

  2. Старые сертификаты в BACKUP_STORE для отката в certificate-manager можно удалить скриптом из KB82560.

  3. Хранилище с именем <vCenter FQDN> появляется при переименовании vCenter Server Appliance через VAMI, можно удалить после перезагрузки.

  4. 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

Новые баги в комментариях.

Tags:
Hubs:
Total votes 1: ↑1 and ↓0+1
Comments9

Articles