TLS-Zertifikate

Konfiguriere externe TLS-Zertifikate für IBM Bob On-Premises, damit bob-ide- und bob-shell-Clients eine sichere Verbindung herstellen können.

Bob stellt seine APIs über HTTPS bereit. Bevor Benutzer über bob-ide oder bob-shell eine Verbindung herstellen können, muss das Endpoint-Zertifikat von den Client-Workstations als vertrauenswürdig eingestuft werden.

Tipp:

Verwende wenn möglich ein Zertifikat, das von einer Unternehmens- oder öffentlich vertrauenswürdigen Zertifizierungsstelle ausgestellt wurde. Dadurch entfällt die Notwendigkeit, Bob-spezifische CA-Zertifikate auf Entwickler-Workstations zu verteilen.

Um jederzeit zum standardmäßigen selbstsignierten Zertifikat zurückzukehren, führe bobctl reset-route aus. Dadurch wird spec.externalCertificate aus dem Bob-Zertifikats-Repository entfernt und der Operator gibt den externen Endpoint an cert-manager zurück.

Verwende diesen Ansatz, wenn ein Zertifikat von einer Unternehmens-PKI oder einer öffentlich vertrauenswürdigen Zertifizierungsstelle verfügbar ist.

Bevor du ein Zertifikat anforderst oder generierst, identifiziere jeden von Bob exponierten Hostnamen. Alle Hostnamen müssen als Subject Alternative Names (SANs) im Zertifikat enthalten sein.

Ingress-Hostnamen abrufen

Führe den folgenden Befehl aus, um alle Bob-Ingress-Hostnamen aufzulisten:

oc get ingress -n <instanz-namespace> \
  -o jsonpath='{range .items[*]}{range .spec.rules[*]}{.host}{"\n"}{end}{end}'

Notiere die zurückgegebenen Hostnamen — sie sind beim Bestellen oder Generieren von Zertifikaten erforderlich.

Zertifikatsanforderungen überprüfen

Stelle sicher, dass das Zertifikat die folgenden Anforderungen erfüllt, bevor es auf Bob angewendet wird:

  • Der private Schlüssel ist unverschlüsselt.
  • Das Zertifikat enthält die vollständige Zertifikatskette.
  • Alle Bob-Ingress-Hostnamen sind als SAN-Einträge enthalten.
  • Zertifikat und Schlüssel werden im PEM-Format bereitgestellt.

Zertifikats-Secret erstellen

Erstelle ein Kubernetes-Secret mit dem Zertifikat und dem privaten Schlüssel:

oc create secret generic my-tls-secret \
  --from-file=tls.crt=tls.crt \
  --from-file=tls.key=tls.key \
  --from-file=ca.crt=ca.crt \
  -n <instanz-namespace>

Um ein vorhandenes Secret zu aktualisieren:

oc create secret generic my-tls-secret \
  --from-file=tls.crt=tls.crt \
  --from-file=tls.key=tls.key \
  --from-file=ca.crt=ca.crt \
  -n <instanz-namespace> \
  --dry-run=client -o yaml | oc apply -f -

Zertifikat anwenden

Konfiguriere Bob zur Verwendung des Zertifikats:

./bobctl setup-route --tls-secret my-tls-secret
ParameterBeschreibung
--tls-secretGibt das Secret an, das das Zertifikat und den privaten Schlüssel enthält.
--no-waitKehrt sofort zurück, ohne auf die Abstimmung zu warten.
--dry-runValidiert die Konfiguration ohne Anwendung der Änderungen.

Zertifikat überprüfen

Überprüfe, ob das erwartete Zertifikat bereitgestellt wird:

echo | openssl s_client \
  -connect <hostname>:443 \
  -servername <hostname> 2>/dev/null \
  | openssl x509 -noout -issuer -subject -dates

Überprüfe folgendes:

  • Der Aussteller ist korrekt.
  • Der Hostname ist in der SAN-Liste vorhanden.
  • Die Gültigkeitsdaten des Zertifikats sind korrekt.

Verwende dieses Verfahren, um ein Zertifikat zu generieren, das von einer privaten oder internen Zertifizierungsstelle signiert ist, und Bob zu konfigurieren, es für externen HTTPS-Traffic zu verwenden.

CA-Zertifikat generieren

Generiere einen privaten Schlüssel und ein selbstsigniertes Zertifikat für die Zertifizierungsstelle:

openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes \
  -key ca.key \
  -sha256 \
  -days 365 \
  -out ca.crt \
  -subj "/CN=<BOB_HOSTNAME> CA"

Dadurch werden ca.key und ca.crt erstellt.

Hinweis:

Bob erwartet, dass das CA-Zertifikat ca.crt heißt, wenn es im Kubernetes-Secret enthalten ist. Wenn du ein vorhandenes CA-Zertifikat verwendest, benenne es vor der Erstellung des Secrets in ca.crt um.

Privaten Server-Schlüssel generieren

Generiere einen unverschlüsselten privaten Schlüssel für das Bob-Endpoint-Zertifikat:

openssl genrsa -out tls.key 4096

Wenn der private Schlüssel mit einer Passphrase verschlüsselt ist, entferne die Passphrase, bevor du fortfährst:

openssl rsa -in encrypted.key -out tls.key

SAN-Konfigurationsdatei erstellen

Erstelle eine Datei mit dem Namen san.cnf und ersetze die Platzhalter-Hostnamen durch die zuvor abgerufenen Ingress-Hostnamen:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
CN = <BOB_HOSTNAME_1>

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = <BOB_HOSTNAME_1>
DNS.2 = <BOB_HOSTNAME_2>
DNS.3 = <BOB_HOSTNAME_3>

Füge DNS.*-Einträge nach Bedarf hinzu oder entferne sie, sodass alle Bob-Ingress-Hostnamen enthalten sind.

Certificate Signing Request generieren

openssl req \
  -new \
  -key tls.key \
  -out tls.csr \
  -config san.cnf

Zertifikat signieren

openssl x509 \
  -req \
  -in tls.csr \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -out tls.crt \
  -days 365 \
  -extensions v3_req \
  -extfile san.cnf

TLS-Secret erstellen

Für Zertifikate, die von einer privaten oder unternehmensinternen Zertifizierungsstelle ausgestellt wurden:

oc create secret generic my-tls-secret \
  --from-file=tls.crt=/pfad/zu/tls.crt \
  --from-file=tls.key=/pfad/zu/tls.key \
  --from-file=ca.crt=/pfad/zu/ca.crt \
  -n <instanz-namespace>

Für öffentlich vertrauenswürdige Zertifikate:

oc create secret tls my-tls-secret \
  --cert=/pfad/zu/tls.crt \
  --key=/pfad/zu/tls.key \
  -n <instanz-namespace>

Zertifikat anwenden

Konfiguriere Bob zur Verwendung des TLS-Secrets:

./bobctl setup-route --tls-secret my-tls-secret

bobctl validiert das Secret, aktualisiert die Bob-Konfiguration und wartet auf den Abschluss der Abstimmung.

ParameterBeschreibung
--tls-secret <secret>Gibt das Secret an, das das TLS-Zertifikat und den privaten Schlüssel enthält.
--no-waitKehrt sofort zurück, ohne auf den Abschluss der Abstimmung zu warten.
--dry-runValidiert die Konfiguration ohne Anwendung der Änderungen.
Hinweis:

Wenn ca.crt nicht im Secret enthalten ist, zeigt bobctl eine Warnung an. Dies ist erwartet, wenn das Zertifikat von einer Zertifizierungsstelle ausgestellt wurde, der Client-Workstations bereits vertrauen.

Zertifikat überprüfen

Überprüfe, ob Bob das erwartete Zertifikat bereitstellt:

echo | openssl s_client \
  -connect <BOB_HOSTNAME_1>:443 \
  -servername <BOB_HOSTNAME_1> 2>/dev/null \
  | openssl x509 -noout -issuer -subject -dates

Überprüfe folgendes:

  • Der Aussteller stimmt mit der erwarteten Zertifizierungsstelle überein.
  • Das Zertifikat enthält die erwarteten Hostname-Einträge.
  • Die Gültigkeitsdaten des Zertifikats sind korrekt.

Wenn die ausstellende Zertifizierungsstelle von Entwickler-Workstations nicht als vertrauenswürdig eingestuft wird, verteile das CA-Zertifikat an Benutzer, bevor sie über bob-ide oder bob-shell eine Verbindung mit Bob herstellen.

Wenn kein externes Zertifikat konfiguriert ist, verwendet Bob ein selbstsigniertes Zertifikat, das von cert-manager verwaltet wird. In dieser Konfiguration müssen Benutzer dem Bob-CA-Zertifikat vertrauen, bevor sie eine Verbindung herstellen.

Zertifikatskonfiguration bestimmen

Überprüfe, ob der externe Bob-Endpoint ein selbstsigniertes Zertifikat verwendet:

oc get secret bob-external-tls -n <instanz-namespace> \
  -o jsonpath='{.data.tls\.crt}' \
  | base64 -d \
  | openssl x509 -noout -issuer
  • Wenn der Aussteller CN=Bob Internal CA ist, verwendet der Cluster das standardmäßige selbstsignierte Zertifikat. Fahre mit dem nächsten Schritt fort.
  • Wenn der Aussteller eine Unternehmens- oder öffentlich vertrauenswürdige Zertifizierungsstelle ist, ist keine clientseitige Zertifikatskonfiguration erforderlich. Siehe Benutzerverwaltung.

CA-Zertifikat exportieren

./bobctl get-ca-cert --output bob-ca.crt

CA-Zertifikat verteilen

Stelle Benutzern das exportierte bob-ca.crt zur Verfügung und weise sie an, es ihrem Betriebssystem-Trust-Store hinzuzufügen. Benutzer können vertrauenswürdige HTTPS-Verbindungen herstellen, nachdem sie das Bob-CA-Zertifikat importiert haben.

Wie ist dieses Thema?