新手常见的 VMware 使用问题

2019-08-02 915点热度 0人点赞

VMware 安装时经常遇到各种奇怪问题,所以简单记一记


1 、 VMware 常见名词概念

  • ESXi VMware vSphere Hypervisor (ESXi) VMware VMvisor Installer
  • VCSA VMware vCenter Server Appliance
  • 精简置备 弹性容量,随用随扩,用多少占多少
  • 厚置备延迟置零 划分等大空间,闲时对未使用空间填充置零
  • 厚置备 划分等大空间,并立刻填充置零

2 、 Vmware License

ESXi 7.0

  • JJ2WR-25L9P-H71A8-6J20P-C0K3F

VCSA 7.0

  • 104HH-D4343-07879-MV08K-2D2H2

ESXi 6.0

  • NF0F3-402E3-MZR80-083QP-3CKM2

VCSA 6.0

  • NU68U-6D04K-08EV8-GK95K-9LRN6

VMware 下载地址 [官方] [非官方]


3 、 VMware vCenter Server 无 DNS 部署

3.1 、 VMware vCenter 7

示例安装:VCSA 7.0 地址 192.168.1.10

  • FQDN = 192.168.1.10
  • DNS = 192.168.1.10
  • 主机名 = localhost

完成 vCenter 第一阶段后,通过命令行进入服务器,修改 Hosts 文件,增加 "192.168.1.10 localhost"

如果该步骤未完成,则 VMware vCenter 第二阶段部署时会因 DNS 检查 而延时并最终卡死无法安装

F2 - Troubleshoot Mode Option - 开启 Bash 和 Shell
F2 - DNS Configuration - Primary DNS Server = 192.168.1.10 - 第二 DNS 任意 - Hostname = localhost
ssh [email protected]
vi /etc/hosts
127.0.0.1 localhost.localdomain
127.0.0.1 localhost
192.168.1.10 localhost

3.2 、 VMware vCenter 6

F2 - Troubleshoot Mode Option - 开启 Bash 和 Shell
F2 - DNS Configuration - Primary DNS Server = 192.168.1.10 - 第二 DNS 任意 - Hostname = photon-machine
ssh [email protected]
vi /etc/hosts
127.0.0.1 localhost.localdomain
127.0.0.1 localhost
192.168.1.10 photon-machine

4 、 VMware vSphere Hypervisor 链路负载均衡

为了保证链路可靠,常见的负载均衡就需要配上

但是在交换机配置好 port link-aggregation group 后,会发现直接断联

原因则是 VMware 默认采用的 主备 链路保障方案,与交换机的 基于 IP 哈希 的负载均衡 不符
而 LACP 方式是曾经的常见办法,但是他的配置管理方式则较为繁琐

知道原因用起来很简单,修改负载均衡方式即可
注意默认管理接口不跟随 vSwitch 的配置,同时可能因配置变动导致接口属性成为备用接口

ESXi - 虚拟交换机 - 编辑 - 绑定和故障切换 - 负载均衡 = 基于 IP 哈希 的路由
ESXi - 网络组 - 编辑 - 属性 - VLAN ID = 10 - 绑定和故障切换 - 负载均衡 = 跟随 vSwitch 配置
Switch - interface range gig0/1-2 - port group 10 - interface port-channel 10 - switchport mode trunk - switchport trunk allow vlan all

5 、 VMware vCenter Server 数据存储数目小于要求

该主机的 vSphere HA 检测信号数据存储数目为 1,少于要求数目:2

常见的单储存或者无存储的问题,添加参数后解除

集群 - vSphere 可用性 - 编辑 - 高级选项 - 添加 ,将下列字段按照需求添加到配置参数中

das.ignoreinsufficienthbdatastore = false
禁用 在主机没有检测到足够的 vSphere HA 数据存储探测信号时提示的配置问题。默认值为 false
das.heartbeatdsperhost = 2
更改所需的检测信号数据存储的数量。有效值范围为 2-5,默认值为 2 。

6 、 VMware vSphere Hypervisor 解除 vSAN 关联

集群误添加 vSAN 功能后,如果加入主机,此时会在主机上生成一个 vSAN 存储

有 vSAN 存储后无法加入 未开启 vSAN 功能的集群

解除 vSAN 的方式是 用 Shell 访问 ESXi 并输入 esxcli vsan cluster leave 命令 [ 链接 ]

ESXi 主机 - 配置 - 服务 - ESXi Shell / SSH - 启动

ssh [email protected]
root@localhost ~# esxcli vsan cluster leave

输入后可以检查到 vSAN 存储消失 并可 移至 未开启 vSAN 功能的集群


7 、 VMware vCenter Server KB55636 警告

官方说明 [ 链接 ]

缘由是 Intel 超线程漏洞引发的安全隐患,VMware 进行提醒。

但是如果用户并不想安装降速补丁,则需要一个办法关闭该消息

ESXi 主机 - 配置 - 高级系统设置,将 VMkernel.Boot.hyperthreadingMitigation 键值修改为 true

VMkernel.Boot.hyperthreadingMitigation = false
根据需要限制同一超线程核心同时使用多个逻辑处理器以缓解安全漏洞。

8 、 VMware + Linux LVM 磁盘扩容

参考链接 [ 链接 ] [ 链接 ]

首先扩容前先关机,打快照,然后再修改磁盘容量(容量只能增不能减)

A 方案:新增磁盘并将 PV 扩展到该磁盘

[root@localhost]~# df -hT

Filesystem                 Type   Size   Mounted on
/dev/sda1                  xfs    1014M  /boot
/dev/sda2                  vfat   128M   /boot/efi
/dev/mapper/centos-root    xfs    100G   /

[root@localhost]~# gdisk /dev/sdb
Command (? for help): n

Partition number (1-128, default 1): 
First sector (34-4194303966, default = 2048) or {+-}size{KMGTP}: 34
Last sector (2048-4194303966, default = 4194303966) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'
Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.
partprobe
pvcreate /dev/sdb1
vgextend centos /dev/sdb1
#swapoff /dev/mapper/centos-swap
#lvresize -L 32GB /dev/centos/centos-swap
#mkswap /dev/mapper/centos-swap
#partprobe
#swapon /dev/mapper/centos-swap
lvresize -l +100%FREE -r /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
partprobe
[root@localhost]~# df -hT

Filesystem                 Type   Size   Mounted on
/dev/sda1                  xfs    1014M  /boot
/dev/sda2                  vfat   128M   /boot/efi
/dev/mapper/centos-root    xfs    2.2T   /

B 方案:单盘,且 LVM 分区后无其他分区,直接修改分区结束位置

[root@localhost]~# df -hT

Filesystem                 Type   Size   Mounted on
/dev/sda1                  xfs    1014M  /boot
/dev/sda2                  vfat   128M   /boot/efi
/dev/mapper/mypvdisk-root  xfs    100G   /
/dev/mapper/mypvdisk-opt   xfs    200G   /var
[root@localhost]~# fdisk -l /dev/sda

Disk /dev/sda: 1073.7 GB ********

Device        Start         End     ID    System
/dev/sda1      2048        4095     83    Linux
/dev/sda2      4096     2101247     83    Linux
/dev/sda3   2101248    65015807     82    Linux swap / Solaris
/dev/sda4  65015808    65279999     8e    Linux LVM
[root@localhost]~# pvs
PV          VG              Fmt   Attr  PSize  PFree
/dev/sda4   mypvdisk-root   lvm2  a--   <368g      0

然后就可以进入系统修改磁盘分区,修改时严格注意扇区头尾对齐类型不变,
(修改目标分区的扩容操作仅需要头部对齐)

[root@localhost]~# fdisk -l /dev/sda

Disk /dev/sda: 1073.7 GB ********

Device        Start         End     ID    System
/dev/sda1      2048        4095     83    Linux
/dev/sda2      4096     2101247     83    Linux
/dev/sda3   2101248    65015807     82    Linux swap / Solaris
/dev/sda4  65015808  2097151999     8e    Linux LVM

修改后执行 partprobe 命令刷新分区表,刷新后即可查看到分区大小改变,如涉及到系统根分区需要重启

[root@localhost]~# pvs
PV          VG              Fmt   Attr  PSize  PFree
/dev/sda4   mypvdisk       lvm2  a--   <368g   600G

接着按照 LVM 动态磁盘分区扩容 的方式开始扩容即可,如果 swap 夹在中间,需要先处理 swap 分区
(resize2fs 对 xfs 分区可能无效,则使用 xfs_growfs 进行分区信息更新)

pvresize /dev/sda4
vgextend mypvdisk /dev/sda4
lvresize -l +100%FREE -r /dev/mypvdisk/mypvdisk-opt
#resize2fs -p /dev/mypvdisk/mypvdisk-opt
xfs_growfs /dev/mypvdisk/mypvdisk-opt
partprobe

手动创建 LV 的命令如下(不包含 fstab 挂载)

pvcreate /dev/sdb1
vgcreate vg_centos /dev/sdb1
lvcreate -l 100%Free -n lv_root vg_centos
mkfs.xfs /dev/vg_centos/lv_root

涉及到 Swap 分区删除时,记得修改 fstsb 和 grub 文件清除相关条目

swapoff /dev/centos/swap
lvremove -y /dev/centos/swap
sed -i "/swap/d" /etc/fstab
sed -i "s/rd.lvm.lv=centos\/swap //" /etc/default/grub

grub2-mkconfig -o /boot/grub2/grub.cfg

9 、 VMware 官方禁止无许可下载安装包

由于 VMware 限制了匿名用户下载安装包,如果想自行使用还需要额外从其他地方下载。

VMware Vsphere 7.0 Release Note [ 链接 ]

可以根据 SHA1 在 Google 上搜索,下载后核验是否为原版 [ 链接 ]

一些常用的客户端软件可以从 高校 使用说明中下载,例如 [ 链接 ]


10 、 Linux 主机安装 VMTools

官方说明 [ 链接 ]

首先重新安装 VMware Tools,会在虚拟机的 CDrom 中插入媒体介质

然后挂载文件夹

mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom

挂载完毕后,我们进入 /mnt/cdrom 中可以查看到 upgrade 和 *.tar.gz 两种文件

由于是首次安装,则需要对 *.tar.gz 文件进行解压

mkdir /tmp/vmtools
cd /tmp/vmtools
tar xf /mnt/cdrom/VMwareTools-*.tar.gz 
cd vmware-tools-distrib

一切完毕后,开始安装

./vmware-install.pl
(*** 一路默认回车 ***)

安装后重启,重启后可以直接查看版本

vmtoolsd -v

如果安装好 Vmware Tools 后发现提示 Vmware 已运行(客户机托管)
则需要卸载 开源版 后重新安装 闭源版(可以忽略附带的组件,不检查依赖关系)

rpm -e open-vm-tools --nodeps

11 、 Windows 2008 R2 无法安装 VMTools

官方说明 [ 链接 ]

问题现象是提示 数字签名无法验证,安装 VMTools 失败

需要下载两个补丁,分别是 kb4474419 kb4490628

下载好后安装重启即可


12 、 Windows 远程桌面 CredSSP 加密数据库修正

Win2012R2 会涉及到此问题,对应 kb4103715

下载好后安装重启即可


13 、 VMware 更新包部署

VMware vCenter Server - Lifecycle Manager - 导入更新

# ESXI 更新包 
VMware-ESXi-7.0U3*-********-depot.zip
# vCenter 更新包
VMware-vCenter-Server-Appliance-7.0.3.0****-********-updaterepo.zip
# vCenter 光盘升级包(命令行)
VMware-vCenter-Server-Appliance-7.0.3.0****-********-patch-FP.iso

14 、 VMware EVC 无法启用

Vmware vCLS 主机无法启动,打开电源失败,提示 “没有与虚拟机兼容的主机”

DRS 功能受 vSphere 集群服务 (vCLS) 的不正常状态影响 [ 链接 ]

vSphere Clustering Service (vCLS) 虚拟机异常处理 [ 链接 ]

问题来源于 Monitor/Mwait Support 支持开关没有开启,此开关可使软件系统对 CPU 硬件进行调度并使用相关指令集

操作过程需要将每台主机轮次进入维护模式,然后重启处理完再恢复。
所有的都处理完毕后可开启 EVC 功能。


15 、虚拟机常见优化步骤

  • VMTools
  • 主机激活
  • 电源管理 - 禁用 显示器关闭/硬盘休眠
  • 视觉效果关闭
  • 禁用光驱
  • 开启远程桌面
  • 开启网络发现
  • 防火墙策略
  • 安装浏览器或 bash-completion 等软件

16 、 VMware ESXi Syslog 日志引出

如果希望在第三方服务器管理或审计 VMware Esxi 的日志,可以进行如下配置 [ 链接 ]

主机-管理-系统-高级设置
Syslog.global.logHost
udp://192.168.2.100:514

配置好日志转发的目的地址后,我们还需要放行防火墙规则,以及限定访问来源

网络-防火墙规则-syslog
启用
192.168.1.10,192.168.2.100

对于 VCSA 来说,也有同样的配置方式,不过 VCSA 仅能配置转发的目的地址 [ 链接 ]

192.168.1.10:5480
Syslog-转发配置
udp://192.168.2.100:514

如果涉及到外部交换机,建议一起配置维护日志完整性

logging on
terminal no monitor
logging server 192.168.2.100
logging trap 7
logging source interface loopback 0
service timestamps debug datetime msec
service timestamps log datetime msec 

17 、 VMware ESXi 安全加固

在 VMware ESXi 安装后,我们需要配置可访问的管理地址并禁止其他地址段访问

网络-防火墙规则-sshServer 
启用规则
192.168.1.10,192.168.2.0/24

网络-防火墙规则-vSphereClient
启用规则
192.168.1.10,192.168.2.0/24

18 、 VMware Vsphere 证书过期

在 VMware ESXi 安装后,默认证书的过期时间是五年。如果没注意时间则会导致证书失效。
对官方而言,这种问题是很容易出现的,所以出了很多个版本的处理办法,但本质就是 更换证书
故障现象可能存在以下表现,具体如下所示,并不限于重启后变更问题内容。

  • User name and password are required
  • Signing certificate is not valid
  • no healthy upstream
  • HTTP Status 400 – Bad Request Message BadRequest, Signing certificate is not valid
  • 503 Service Unavailable (Failed to connect to endpoint: _pipeName=/var/run/vmware/vpxd-webserver-pipe)
  • Cannot connect to vCenter Single Sign-On server https://IP/sts/STSService/vsphere.local
  • Exception in invoking authentication handler [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1076)

CertificateStatusAlarm - 存在已过期或即将过期的证书/VMware vCenter Server 上触发证书状态更改警报

使用命令行验证并解决过期的 vCenter Server 证书

如何使用 vSphere Certificate Manager 替换 SSL 证书

首先第一件事,登录 ESXI 宿主机,关闭 Vcenter 主机,并拍摄快照(误操作恢复用)

然后开启 Vcenter 主机,使用 Console 直接访问,开启后 F2 登录,输入密码,选择 Troubleshooting Mode Options 并开启 Bash 和 Shell(修好后记得关闭!)

接着使用 SSH 工具,选择 用户名和密码 验证方式,访问 Vcenter 主机 IP 的 22 端口。成功登录后可能需要让你修改密码,注意这个修改密码和 Console 密码等同,且会识别弱口令字典。

修改好后我们就可以运行如下命令检查证书状态

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;

输入完上面的命令后,会出现类似下面的内容。注意观察不同区域的字段内容,并检查响应的过期时间
官方的图片参考链接 [ 链接 ]

  • MACHINE_SSL_CERT,主机证书,最主要的,且时间只有两年的证书,该证书影响一切授权校验行为
  • TRUSTED_ROOTS,根证书,影响主机一切证书的时间,如果这个过期,则需要全面更换证书
  • machine 等等 ,业务证书,影响主机服务的内部访问,通常该时间都和根证书同步
------------------------
[*] Store : MACHINE_SSL_CERT
Alias : __MACHINE_CERT
Not After : Apr 1 12:00:00 2022 GMT
------------------------
[*] Store : TRUSTED_ROOTS
Alias : 59ae7b8994c40183a17040de3e3624dbac3635c3
Not After : Mar 28 03:00:00 2030 GMT
------------------------
[*] Store : machine
Alias : machine
Not After : Mar 28 03:00:00 2030 GMT
[*] Store : vsphere-webclient
Alias : vsphere-webclient
Not After : Mar 28 03:00:00 2030 GMT
[*] Store : vpxd
Alias : vpxd
Not After : Mar 28 03:00:00 2030 GMT
[*] Store : vpxd-extension
Alias : vpxd-extension
Not After : Mar 28 03:00:00 2030 GMT
------------------------
[*] Store : hvc
Alias : hvc
Not After : Mar 28 03:00:00 2030 GMT
[*] Store : data-encipherment
Alias : data-encipherment
Not After : Mar 28 03:00:00 2030 GMT
[*] Store : APPLMGMT_PASSWORD
[*] Store : SMS
Alias : sms_self_signed
Not After : Apr 2 03:00:00 2030 GMT
[*] Store : wcp
Alias : wcp
Not After : Mar 28 03:00:00 2030 GMT

从中我们可以发现,当 MACHINE_SSL_CERT 在平台建设两年后,就会产生过期。在过期前如果巡检可能注意到告警,同时 Vsphere 7.0 以上版本可以在网页直接重签证书,如果不会命令行还可以通过改计算机时间绕过过期情况进行解决,所以还算比较好处理。当 TRUSTED_ROOTS 在平台建设五年后过期时,会导致全部证书失效,此时就只能重头开始生成证书,并且期间操作需要反复执行。

然后准备证书重新生成时需要信息,常用的信息如下(按照本文章上述安装时填写的 FQDN 获得的 PNID)

IPAddress = your ip address
Hostname = your ip address
VMCA Name = your ip address
# 得到的证书信息如下所示 
Resetting STS certificate for localhost started on Wed Apr 10 05:09:01 UTC 2024

Detected DN: cn=192.168.1.10,ou=Domain Controllers,dc=vsphere,dc=local
Detected PNID: 192.168.1.10
Detected PSC: 192.168.1.10
Detected SSO domain name: vsphere.local
Detected Machine ID: 213b463f-7db3-4cd4-a79c-eef8498c74fe
Detected IP Address: 192.168.1.10
Domain CN: dc=vsphere,dc=local
# 如使用域名方式安装,涉及到的信息如下所示 
IPAddress = your ip address
Hostname = your domain
VMCA Name = your domain

接下来操作证书前,我们需要关闭服务,这里不需要开启,因为做完操作没问题通常都是重启

# 关闭全部服务(关闭后将导致无法进行登录操作)
service-control --stop --all
# 开启全部服务(排查用)
service-control --start --all

官方也提供了一个比较方便的脚本用于重新生成 TRUSTED_ROOTS 证书,脚本如下 fixsts.sh

#!/bin/bash
# Run this from the affected PSC/VC
# Luciano Delorenzi [[email protected]] - 1/2/2020

# NOTE: This works on external and embedded PSCs
# This script will do the following
# 1: Regenerate STS certificate
#
#
# What is needed?
# 1: Offline snapshots of VCs/PSCs
# 2: SSO Admin Password

NODETYPE=$(cat /etc/vmware/deployment.node.type)
if [ "$NODETYPE" = "management" ]; then
echo "Detected this node is a vCenter server with external PSC."
echo "Please run this script from a vCenter with embedded PSC, or an external PSC"
exit 0
fi


echo "NOTE: This works on external and embedded PSCs"
echo "This script will do the following"
echo "1: Regenerate STS certificate"
echo "What is needed?"
echo "1: Offline snapshots of VCs/PSCs"
echo "2: SSO Admin Password"
echo "IMPORTANT: This script should only be run on a single PSC per SSO domain"


mkdir -p /tmp/vmware-fixsts
SCRIPTPATH="/tmp/vmware-fixsts"
LOGFILE="$SCRIPTPATH/fix_sts_cert.log"

echo "==================================" | tee -a $LOGFILE
echo "Resetting STS certificate for $HOSTNAME started on $(date)" | tee -a $LOGFILE
echo ""| tee -a $LOGFILE
echo ""
DN=$(/opt/likewise/bin/lwregshell list_values '[HKEY_THIS_MACHINE\Services\vmdir]' | grep dcAccountDN | awk '{$1=$2=$3="";print $0}'|tr -d '"'|sed -e 's/^[ \t]*//')
echo "Detected DN: $DN" | tee -a $LOGFILE
PNID=$(/opt/likewise/bin/lwregshell list_values '[HKEY_THIS_MACHINE\Services\vmafd\Parameters]' | grep PNID | awk '{print $4}'|tr -d '"')
echo "Detected PNID: $PNID" | tee -a $LOGFILE
PSC=$(/opt/likewise/bin/lwregshell list_values '[HKEY_THIS_MACHINE\Services\vmafd\Parameters]' | grep DCName | awk '{print $4}'|tr -d '"')
echo "Detected PSC: $PSC" | tee -a $LOGFILE
DOMAIN=$(/opt/likewise/bin/lwregshell list_values '[HKEY_THIS_MACHINE\Services\vmafd\Parameters]' | grep DomainName | awk '{print $4}'|tr -d '"')
echo "Detected SSO domain name: $DOMAIN" | tee -a $LOGFILE
SITE=$(/opt/likewise/bin/lwregshell list_values '[HKEY_THIS_MACHINE\Services\vmafd\Parameters]' | grep SiteName | awk '{print $4}'|tr -d '"')
MACHINEID=$(/usr/lib/vmware-vmafd/bin/vmafd-cli get-machine-id --server-name localhost)
echo "Detected Machine ID: $MACHINEID" | tee -a $LOGFILE
IPADDRESS=$(ifconfig | grep eth0 -A1 | grep "inet addr" | awk -F ':' '{print $2}' | awk -F ' ' '{print $1}')
echo "Detected IP Address: $IPADDRESS" | tee -a $LOGFILE
DOMAINCN="dc=$(echo "$DOMAIN" | sed 's/\./,dc=/g')"
echo "Domain CN: $DOMAINCN"
ADMIN="cn=administrator,cn=users,$DOMAINCN"
USERNAME="administrator@${DOMAIN^^}"
ROOTCERTDATE=$(openssl x509 -in /var/lib/vmware/vmca/root.cer -text | grep "Not After" | awk -F ' ' '{print $7,$4,$5}')
TODAYSDATE=$(date | awk -F ' ' '{print $6,$2,$3}')

echo "#" > $SCRIPTPATH/certool.cfg
echo "# Template file for a CSR request" >> $SCRIPTPATH/certool.cfg
echo "#" >> certool.cfg
echo "# Country is needed and has to be 2 characters" >> $SCRIPTPATH/certool.cfg
echo "Country = DS" >> $SCRIPTPATH/certool.cfg
echo "Name = $PNID" >> $SCRIPTPATH/certool.cfg
echo "Organization = VMware" >> $SCRIPTPATH/certool.cfg
echo "OrgUnit = VMware" >> $SCRIPTPATH/certool.cfg
echo "State = VMware" >> $SCRIPTPATH/certool.cfg
echo "Locality = VMware" >> $SCRIPTPATH/certool.cfg
echo "IPAddress = $IPADDRESS" >> $SCRIPTPATH/certool.cfg
echo "Email = [email protected]" >> $SCRIPTPATH/certool.cfg
echo "Hostname = $PNID" >> $SCRIPTPATH/certool.cfg

echo "==================================" | tee -a $LOGFILE
echo "==================================" | tee -a $LOGFILE
echo ""
echo "Detected Root's certificate expiration date: $ROOTCERTDATE" | tee -a $LOGFILE
echo "Detected today's date: $TODAYSDATE" | tee -a $LOGFILE

echo "==================================" | tee -a $LOGFILE

flag=0
if [[ $TODAYSDATE > $ROOTCERTDATE ]];
then
echo "IMPORTANT: Root certificate is expired, so it will be replaced" | tee -a $LOGFILE
flag=1
mkdir /certs && cd /certs
cp $SCRIPTPATH/certool.cfg /certs/vmca.cfg
/usr/lib/vmware-vmca/bin/certool --genselfcacert --outprivkey /certs/vmcacert.key --outcert /certs/vmcacert.crt --config /certs/vmca.cfg
/usr/lib/vmware-vmca/bin/certool --rootca --cert /certs/vmcacert.crt --privkey /certs/vmcacert.key
fi

echo "#" > $SCRIPTPATH/certool.cfg
echo "# Template file for a CSR request" >> $SCRIPTPATH/certool.cfg
echo "#" >> $SCRIPTPATH/certool.cfg
echo "# Country is needed and has to be 2 characters" >> $SCRIPTPATH/certool.cfg
echo "Country = DS" >> $SCRIPTPATH/certool.cfg
echo "Name = STS" >> $SCRIPTPATH/certool.cfg
echo "Organization = VMware" >> $SCRIPTPATH/certool.cfg
echo "OrgUnit = VMware" >> $SCRIPTPATH/certool.cfg
echo "State = VMware" >> $SCRIPTPATH/certool.cfg
echo "Locality = VMware" >> $SCRIPTPATH/certool.cfg
echo "IPAddress = $IPADDRESS" >> $SCRIPTPATH/certool.cfg
echo "Email = [email protected]" >> $SCRIPTPATH/certool.cfg
echo "Hostname = $PNID" >> $SCRIPTPATH/certool.cfg



echo ""
echo "Exporting and generating STS certificate" | tee -a $LOGFILE
echo ""

cd $SCRIPTPATH

/usr/lib/vmware-vmca/bin/certool --server localhost --genkey --privkey=sts.key --pubkey=sts.pub
/usr/lib/vmware-vmca/bin/certool --gencert --cert=sts.cer --privkey=sts.key --config=$SCRIPTPATH/certool.cfg

openssl x509 -outform der -in sts.cer -out sts.der
CERTS=$(csplit -f root /var/lib/vmware/vmca/root.cer '/-----BEGIN CERTIFICATE-----/' '{*}' | wc -l)
openssl pkcs8 -topk8 -inform pem -outform der -in sts.key -out sts.key.der -nocrypt
i=1
until [ $i -eq $CERTS ]
do
openssl x509 -outform der -in root0$i -out vmca0$i.der
((i++))
done

echo ""
echo ""
read -s -p "Enter password for administrator@$DOMAIN: " DOMAINPASSWORD


TENANTS=$(/opt/likewise/bin/ldapsearch -h localhost -p 389 -b "cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" "(objectclass=vmwSTSTenantCredential)" | grep numEntries | awk '{print $3}')
echo ""
TRUSTEDCERTCHAINS=$(/opt/likewise/bin/ldapsearch -h localhost -p 389 -b "cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" "(objectclass=vmwSTSTenantTrustedCertificateChain)" | grep numEntries | awk '{print $3}')
echo "Amount of tenant credentials: $TENANTS" | tee -a $LOGFILE
i=1
if [ ! -z $TENANTS ]
then
until [ $i -gt $TENANTS ]
do
echo "Exporting tenant $i to $SCRIPTPATH" | tee -a $LOGFILE
echo ""
ldapsearch -h localhost -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" -b "cn=TenantCredential-$i,cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" > $SCRIPTPATH/tenantcredential-$i.ldif
echo "Deleting tenant $i" | tee -a $LOGFILE
ldapdelete -h localhost -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" "cn=TenantCredential-$i,cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" | tee -a $LOGFILE
((i++))
done
fi
echo ""

echo "Amount of trustedcertchains: $TRUSTEDCERTCHAINS" | tee -a $LOGFILE
i=1
if [ ! -z $TRUSTEDCERTCHAINS ]
then
until [ $i -gt $TRUSTEDCERTCHAINS ]
do
echo "Exporting trustedcertchain $i to $SCRIPTPATH" | tee -a $LOGFILE
ldapsearch -h localhost -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" -b "cn=TrustedCertChain-$i,cn=TrustedCertificateChains,cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" > $SCRIPTPATH/trustedcertchain-$i.ldif
echo ""
echo "Deleting trustedcertchain $i" | tee -a $LOGFILE
ldapdelete -h localhost -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" "cn=TrustedCertChain-$i,cn=TrustedCertificateChains,cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" | tee -a $LOGFILE
((i++))
done
fi
echo ""

i=1
echo "dn: cn=TenantCredential-1,cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" > sso-sts.ldif
echo "changetype: add" >> sso-sts.ldif
echo "objectClass: vmwSTSTenantCredential" >> sso-sts.ldif
echo "objectClass: top" >> sso-sts.ldif
echo "cn: TenantCredential-1" >> sso-sts.ldif
echo "userCertificate:< file:sts.der" >> sso-sts.ldif
until [ $i -eq $CERTS ]
do
echo "userCertificate:< file:vmca0$i.der" >> sso-sts.ldif
((i++))
done
echo "vmwSTSPrivateKey:< file:sts.key.der" >> sso-sts.ldif
echo "" >> sso-sts.ldif
echo "dn: cn=TrustedCertChain-1,cn=TrustedCertificateChains,cn=$DOMAIN,cn=Tenants,cn=IdentityManager,cn=Services,$DOMAINCN" >> sso-sts.ldif
echo "changetype: add" >> sso-sts.ldif
echo "objectClass: vmwSTSTenantTrustedCertificateChain" >> sso-sts.ldif
echo "objectClass: top" >> sso-sts.ldif
echo "cn: TrustedCertChain-1" >> sso-sts.ldif
echo "userCertificate:< file:sts.der" >> sso-sts.ldif
i=1
until [ $i -eq $CERTS ]
do
echo "userCertificate:< file:vmca0$i.der" >> sso-sts.ldif
((i++))
done
echo ""
echo "Applying newly generated STS certificate to SSO domain" | tee -a $LOGFILE

/opt/likewise/bin/ldapmodify -x -h localhost -p 389 -D "cn=administrator,cn=users,$DOMAINCN" -w "$DOMAINPASSWORD" -f sso-sts.ldif | tee -a $LOGFILE
echo ""
echo "Replacement finished - Please restart services on all vCenters and PSCs in your SSO domain" | tee -a $LOGFILE
echo "==================================" | tee -a $LOGFILE
echo "IMPORTANT: In case you're using HLM (Hybrid Linked Mode) without a gateway, you would need to re-sync the certs from Cloud to On-Prem after following this procedure" | tee -a $LOGFILE
echo "==================================" | tee -a $LOGFILE
echo "==================================" | tee -a $LOGFILE
if [ $flag == 1 ]
then
echo "Since your Root certificate was expired and was replaced, you will need to replace your MachineSSL and Solution User certificates" | tee -a $LOGFILE
echo "You can do so following this KB: https://kb.vmware.com/s/article/2097936" | tee -a $LOGFILE
fi

然后就可以生成证书了,注意默认的证书参数文件的信息是错误的,我们需要重新填写,不能参考默认信息

#证书管理程序路径
/usr/lib/vmware-vmca/bin/certificate-manager
#默认证书信息路径
/usr/lib/vmware-vmca/share/config/certool.cfg

可以参考 VMware vCenter Server STS 证书过期解决 [ 链接 ]

StarryVoid

Have a good time