Freigeben über


Verwenden von „Let's Encrypt“-Zertifikaten im Anwendungsgateway für AKS-Cluster

Sie können Ihre Azure Kubernetes Service (AKS)-Instanz so konfigurieren, dass sie Let's Encrypt verwendet und automatisch ein TLS/SSL-Zertifikat für Ihre Domäne abruft. Das Zertifikat wird in Azure Application Gateway installiert, das ein SSL/TLS-Abschluss für den AKS-Cluster ausführt.

Bei der in diesem Artikel beschriebenen Konfiguration wird das Kubernetes-Add-On cert-manager verwendet, mit dem die Erstellung und Verwaltung von Zertifikaten automatisiert wird.

Tipp

Ziehen Sie für Ihre Kubernetes-Eingangslösung das Application Gateway für Container in Betracht.

Installieren des Add-Ons

Führen Sie die folgenden Schritte aus, um cert-manager auf Ihrem vorhandenen AKS-Cluster zu installieren:

  1. Führen Sie das folgende Skript aus, um das Helm-Diagramm on cert-manager zu installieren. Dieses Skript führt folgende Aktionen aus:

    • Erstellt einen neuen cert-manager-Namespace in Ihrem AKS
    • Erstellt die folgenden benutzerdefinierten Ressourcendefinitionen (CRDs): Certificate, Challenge, ClusterIssuer, Issuer, Order
    • Installiert das cert-manager-Diagramm (von der cert-manager-Website)
    #!/bin/bash
    
    # Install the CustomResourceDefinition resources separately
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.crds.yaml
    
    # Create the namespace for cert-manager
    kubectl create namespace cert-manager
    
    # Label the cert-manager namespace to disable resource validation
    kubectl label namespace cert-manager cert-manager.io/disable-validation=true
    
    # Add the Jetstack Helm repository
    helm repo add jetstack https://charts.jetstack.io
    
    # Update your local Helm chart repository cache
    helm repo update
    
    # Install the cert-manager Helm chart
    # Helm v3+
    helm install \
      cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --version v1.16.1 \
      # --set installCRDs=true
    
    # To automatically install and manage the CRDs as part of your Helm release,
    # you must add the --set installCRDs=true flag to your Helm installation command.
    
  2. Erstellen Sie eine ClusterIssuer-Ressource. Cert-manager erfordert, dass diese Ressource die „Let's Encrypt“-Zertifizierungsstelle darstellt, die das signierte Zertifikat ausgibt.

    Durch Verwendung der ClusterIssuer-Ressource ohne Namespaces werden mit cert-manager Zertifikate ausgegeben, die von mehreren Namespaces genutzt werden können. „Let's Encrypt“ verwendet das ACME-Protokoll, um zu überprüfen, ob Sie einen bestimmten Domänennamen steuern, und um ein Zertifikat auszustellen. Weitere Informationen zum Konfigurieren von ClusterIssuer-Eigenschaften finden Sie in der cert-manager-Dokumentation.

    ClusterIssuer weist den cert-manager an, Zertifikate mithilfe der „Let's Encrypt“-Staging-Umgebung, die für Tests verwendet wird, auszustellen. (Das Stammzertifikat ist in Browser-/Clientvertrauensspeichern nicht vorhanden.)

    Der Standard-Abfragetyp in der folgenden YAML lautet http01. Weitere Captcha-Typen finden Sie in der Dokumentation zu „Let's Encrypt“.

    Vergessen Sie nicht, im folgenden YAML <YOUR.EMAIL@ADDRESS> durch ihre Informationen zu ersetzen.

    #!/bin/bash
    kubectl apply -f - <<EOF
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-staging
    spec:
      acme:
        # You must replace this email address with your own.
        # Let's Encrypt uses this to contact you about expiring
        # certificates, and issues related to your account.
        email: <YOUR.EMAIL@ADDRESS>
        # ACME server URL for Let's Encrypt's staging environment.
        # The staging environment won't issue trusted certificates but is
        # used to ensure that the verification process is working properly
        # before moving to production
        server: https://acme-staging-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          # Secret resource used to store the account's private key.
          name: example-issuer-account-key
        # Enable the HTTP-01 challenge provider
        # you prove ownership of a domain by ensuring that a particular
        # file is present at the domain
        solvers:
          - http01:
            ingress:
             #   class: azure/application-gateway
               ingressTemplate:
                 metadata:
                   annotations:
                     kubernetes.io/ingress.class: azure/application-gateway
    EOF
    
  3. Erstellen Sie eine Eingangsressource, um die Anwendung guestbook mithilfe der Application Gateway-Bereitstellung mit dem „Lets Encrypt“-Zertifikat verfügbar zu machen.

    Stellen Sie sicher, dass Ihre Application Gateway-Bereitstellung über eine öffentliche Front-End-IP-Konfiguration mit einem DNS-Namen verfügt. Verwenden Sie die Standarddomäne azure.com, oder stellen Sie eine Azure DNS-Zone bereit, und weisen Sie dann Ihre eigene benutzerdefinierte Domäne zu. Die Anmerkung certmanager.k8s.io/cluster-issuer: letsencrypt-staging weist cert-manager an, die markierte Eingangsressource zu verarbeiten.

    Im folgenden YAML müssen Sie unbedingt <PLACEHOLDERS.COM> durch Ihre eigene Domäne oder durch die Application Gateway-Domäne (z. B. kh-aks-ingress.westeurope.cloudapp.azure.com) ersetzen.

    kubectl apply -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: guestbook-letsencrypt-staging
      annotations:
        kubernetes.io/ingress.class: azure/application-gateway
        cert-manager.io/cluster-issuer: letsencrypt-staging
    spec:
      tls:
      - hosts:
        - <PLACEHOLDERS.COM>
        secretName: guestbook-secret-name
      rules:
      - host: <PLACEHOLDERS.COM>
          http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 80
    EOF
    

    Nach wenigen Sekunden können Sie über die HTTPS-URL von Application Gateway unter Verwendung des automatisch für das Staging ausgestellten „Let's Encrypt“-Zertifikats auf den guestbook-Dienst zugreifen.

    Ihr Browser warnt Sie möglicherweise über eine ungültige Zertifizierungsstelle. Der Grund dafür ist, dass CN=Fake LE Intermediate X1 das Stagingzertifikat ausgestellt hat. Diese Warnung bedeutet, dass das System wie erwartet funktioniert hat und das Produktionszertifikat verwendet werden kann.

  4. Nachdem Sie das Stagingzertifikat erfolgreich eingerichtet haben, können Sie zu einem ACME-Produktionsserver wechseln:

    1. Ersetzen Sie die Staginganmerkung in der Eingangsressource durch cert-manager.io/cluster-issuer: letsencrypt-prod.
    2. Löschen Sie die vorhandene Staging-ClusterIssuer-Ressource, die Sie zuvor erstellt haben. Erstellen Sie eine neue Stagingressource, indem Sie den ACME-Server aus dem vorherigen ClusterIssuer-YAML durch https://acme-v02.api.letsencrypt.org/directoryersetzen.

Bevor das „Let's Encrypt“-Zertifikat abläuft, wird das Zertifikat im Kubernetes-Geheimspeicher von cert-manager automatisch aktualisiert. Zu diesem Zeitpunkt wendet der Application Gateway-Eingangscontroller das aktualisierte Geheimnis an, auf das in den Ingress-Ressourcen verwiesen wird, die zum Konfigurieren von Application Gateway verwendet werden.