Zum Hauptinhalt springen

HTTPS aktivieren

Mit cert-manager lassen Sie TLS-Zertifikate automatisch von Let's Encrypt ausstellen und rechtzeitig vor Ablauf erneuern. Die Zertifikate werden als Kubernetes-Secrets abgelegt und vom Ingress Controller zur TLS-Terminierung verwendet.

Voraussetzungen

  • Ein installierter Ingress Controller, siehe Ingress Controller installieren
  • Eine Domain, deren DNS-A-Record auf die externe Adresse des Ingress Controllers zeigt
  • Installiertes Helm
Warnung

Der DNS-Eintrag muss vor der Zertifikatsanforderung auf die externe Adresse zeigen und öffentlich auflösbar sein. Let's Encrypt prüft die Kontrolle über die Domain per HTTP-Anfrage – schlägt diese fehl, wird kein Zertifikat ausgestellt.

Die externe Adresse ermitteln Sie mit:

kubectl get service -n ingress-nginx ingress-nginx-controller

cert-manager installieren

helm repo add jetstack https://charts.jetstack.io
helm repo update

helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--set crds.enabled=true

Installation prüfen:

kubectl get pods -n cert-manager

Alle drei Pods (cert-manager, cert-manager-webhook, cert-manager-cainjector) sollten den Status Running aufweisen.

ClusterIssuer anlegen

Ein ClusterIssuer beschreibt, von welcher Zertifizierungsstelle Zertifikate bezogen werden.

Zunächst mit der Staging-Umgebung testen

Let's Encrypt begrenzt die Anzahl der Anfragen je Domain deutlich. Testen Sie Ihre Konfiguration daher zuerst gegen die Staging-Umgebung:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: ihre-adresse@example.com
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
ingressClassName: nginx

Produktive Umgebung

Sobald der Test erfolgreich war, legen Sie den produktiven Issuer an:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: ihre-adresse@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
ingressClassName: nginx

Anwenden und prüfen:

kubectl apply -f clusterissuer.yaml
kubectl get clusterissuer

In der Spalte READY sollte True stehen.

Ingress um TLS erweitern

Ergänzen Sie Ihren Ingress um die Annotation für den Issuer und einen tls-Abschnitt:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: web-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80

Anwenden:

kubectl apply -f ingress.yaml

Das unter secretName angegebene Secret wird von cert-manager automatisch angelegt – Sie müssen es nicht selbst erstellen.

Ausstellung verfolgen

# Status des Zertifikats
kubectl get certificate

# Details und Ereignisse
kubectl describe certificate web-tls

# Laufende Anforderungen
kubectl get certificaterequest
kubectl get order

Die Ausstellung dauert in der Regel ein bis zwei Minuten. Anschließend steht in der Spalte READY des Zertifikats True.

Prüfen Sie das Ergebnis:

curl -I https://app.example.com

Automatische Erneuerung

cert-manager erneuert Zertifikate selbstständig, üblicherweise 30 Tage vor Ablauf. Ein manueller Eingriff ist nicht erforderlich, solange DNS-Eintrag und Ingress unverändert bleiben.

Fehlersuche

SymptomMögliche Ursache
Zertifikat bleibt auf READY: FalsePrüfen Sie kubectl describe certificate <name> sowie die zugehörigen Order- und Challenge-Objekte
Challenge schlägt fehlDer DNS-Eintrag zeigt nicht auf die externe Adresse des Ingress Controllers oder ist noch nicht propagiert
rate limited in den EreignissenDas Kontingent von Let's Encrypt ist ausgeschöpft; verwenden Sie zum Testen den Staging-Issuer
Browser meldet ein nicht vertrauenswürdiges ZertifikatDas Zertifikat stammt vom Staging-Issuer; stellen Sie auf letsencrypt-prod um

Logs von cert-manager:

kubectl logs -n cert-manager -l app.kubernetes.io/name=cert-manager

Verwandte Themen