Skip to end of metadata
Go to start of metadata

Nachdem ich bereits die meisten Systeme auf Let’s Encrypt umgestellt hatte wollte ich endlich auch eine Lösung für mein Demo-Vcenter finden.

Schritt-für-Schritt-Anleitung


  1. Wir brauchen ein DNS-Bases Let’s Encrypt Config, ggf. auch einfach ein Let’s Encrypt direkt auf dem vCenter ... wie ich das gemacht habe berichte ich gern mal später
  2. Sobald die Zertifikate auf dem vCenter angekommen sind, müssen Sie irgendwie eingespielt werden, allerdings ist das nicht ganz trivial weil der Cert-Manager keine Automatisierung zulässt, daher habe ich gesucht und bin über "setsid" auf eine Lösung gestossen die Eingabe durch eine Pipe ersetzen zu können, und habe auch ein bereits fast fertiges Script im Netz gefunden:
    https://wiki.9r.com.au/display/9R/LetsEncrypt+Certificates+for+vCenter+and+PSC
  3. Allerdings ist das ein wenig älter und spätestens beim vCenter 6.7 stößt man darauf, das Python keine Passwort-Eingaben über Pipe mehr zulässt, von daher musste es angepasst werden, das Ergebnis ist nicht besonders Schick, eher gleich "quick and dirty" aber sollte zumindest eine weile Funktionieren (wink)


/usr/local/bin/vcenter-cert-update-vmwareshell.sh
#!/bin/bash

# vCenter/PSC SSL Certificate Updater.
# For more information see
#  https://wiki.9r.com.au/display/9R/LetsEncrypt+Certificates+for+vCenter+and+PSC
#  Change for vCenter 6.7 https://wiki.laube.bayern/x/GoAT

# Copyright (c) 2018 - Rob Thomas - xrobau@linux.com
# Changed   (c) 2019 - Markus Laube - markus@laube.bayern

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

CERTNAME='vcenter.domain.tld'
ADMINACCOUNT='Administrator@vsphere.local'
ADMINPASS='Password'
CERT=/etc/lets-certs/cert.pem
KEY=/etc/lets-certs/privkey.pem
CHAIN=/etc/lets-certs/fullchain.pem


# This is the sample file we compare against the latest file from acme.sh,
# and is present on both a PSC and a vCenter server.
CURRENTLIVE=/etc/vmware-rhttpproxy/ssl/rui.crt

# These environment variables are needed by vCenter
eval $(awk '{ print "export " $1 }' /etc/sysconfig/vmware-environment)

# Nothing should need to be touched below here

if [ ! -e $CERT ]; then
	echo "Can't find cert $CERT - is update.conf correct?"
	exit 1
fi

# Compare the MD5sums of the running cert and the current LE cert
LIVEMD5=$(md5sum $CURRENTLIVE | cut -d\  -f1)
CURRENTMD5=$(md5sum $CERT | cut -d\  -f1)

if [ "$LIVEMD5" == "$CURRENTMD5" ]; then
	# Nothing to be done. Current certificate is correct
	exit 0
fi
# We need to update this machine with the new certificate.

## OK - wir müssen zuerst /usr/lib/vmware/site-packages/cis/certificateManagerOps.py Patchen
## sonst bekommen wir Account und Passwort nicht durch die "|"
## Ich selbst habe eine dauerhafte NOTFALLSICHERUNG unter /usr/lib/vmware/site-packages/cis/certificateManagerOps.py.original

# Backup Original certificateManagerOps.py
cp /usr/lib/vmware/site-packages/cis/certificateManagerOps.py /usr/lib/vmware/site-packages/cis/certificateManagerOps.py.sicherung

# Change Python getpass.getpass to Python sys.stdin.readline
sed -i 's#getpass.getpass.*#sys.stdin.readline\(\).rstrip\(\)#g' /usr/lib/vmware/site-packages/cis/certificateManagerOps.py

# Now we can start

# We delay briefly between account and password, as it's trying to open /dev/tty
# which has the potential to lose characters. To be on the safe side, we sleep
# between important bits. I feel that adding a 15 second delay to the upgrade that
# takes 10 minutes to run is not a big deal!
(
  printf '1\n%s\n' "$ADMINACCOUNT"
  sleep 5
  printf '%s\n' "$ADMINPASS"
  sleep 5
  printf '2\n'
  sleep 5
  printf '%s\n%s\n%s\ny\n\n' "$CERT" "$KEY" "$CHAIN"
) | setsid /usr/lib/vmware-vmca/bin/certificate-manager

# 'setsid' detatches certman from /dev/tty, so it's forced to use stdin.

# Restore the original /usr/lib/vmware/site-packages/cis/certificateManagerOps.py
cp /usr/lib/vmware/site-packages/cis/certificateManagerOps.py.sicherung /usr/lib/vmware/site-packages/cis/certificateManagerOps.py

Quellenangaben, Idee und wesentliche Code Bestandteile sind von hier:

https://wiki.9r.com.au/display/9R/LetsEncrypt+Certificates+for+vCenter+and+PSC 

Verwandte Artikel




Write a comment…