SSL für Cloud Endpoints mit ESP aktivieren

Auf dieser Seite wird erläutert, wie Sie einen SSL-Port (Secure Sockets Layer) für die Bereitstellung des Extensible Service Proxys (ESP) mit Google Kubernetes Engine, Kubernetes oder Compute Engine aktivieren. Möglicherweise möchten Sie für einige Anwendungsfälle einen SSL-Port für den bereitgestellten Endpoints-Dienst aktivieren. Wenn Sie beispielsweise die Transcodierungsfunktion von gRPC verwenden, soll der Dienst HTTP 1.1- und gRPC-Anfragen an demselben Port empfangen.

Sie sollten jedoch die Anleitungen für den ausgewählten Diensttyp und die ausgewählte Umgebung gelesen haben und wissen, wie Sie ESP ohne SSL bereitstellen.

SSL-Schlüssel und -Zertifikate konfigurieren

So konfigurieren Sie den SSL-Port für die Bereitstellung von HTTPS-Anfragen:

  1. Prüfen Sie, ob die SSL-Schlüsseldatei den Namen nginx.key hat und die Zertifikatdatei den Namen nginx.crt hat. Zu Testzwecken können Sie mithilfe von OpenSSL mit dem folgenden Befehl ein selbst signiertes nginx.key und nginx.cert generieren:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. Geben Sie in Ihrem Serverzertifikat CN und subjectAltName an. Der Wert dieser Attribute sollte mit dem DNS oder der IP-Adresse übereinstimmen, die von Clients zum Aufrufen Ihres Dienstes verwendet wird. Andernfalls schlägt der SSL-Handshake fehl.

SSL für ESP in Kubernetes aktivieren

So aktivieren Sie den SSL-Port für den ESP in Kubernetes:

  1. Erstellen Sie mit Ihrem SSL-Schlüssel und -Zertifikat ein Kubernetes-Secret:

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. Bearbeiten Sie die Kubernetes-Konfigurationsdateien, z. B. esp_echo_gke.yaml, wie im folgenden Snippet dargestellt:

    template:
      metadata:
        labels:
          app: esp-echo
      spec:
        volumes:
        - name: nginx-ssl
          secret:
            secretName: nginx-ssl
        containers:
        - name: esp
          image: gcr.io/endpoints-release/endpoints-runtime:1
          args: [
            "--http_port", "8080",
            "--ssl_port", "443",
            "--backend", "127.0.0.1:8081",
            "--service", "SERVICE_NAME",
            "--rollout_strategy", "managed",
          ]
          ports:
            - containerPort: 8080
            - containerPort: 443
          volumeMounts:
          - mountPath: /etc/nginx/ssl
            name: nginx-ssl
            readOnly: true
        - name: echo
          image: gcr.io/endpoints-release/echo:latest
          ports:
            - containerPort: 8081

    Hinweis: Sie sehen in dem Konfigurationsbeispiel die zu bearbeitenden Zeilen. Zur Bereitstellung der Datei in Cloud Endpoints ist die vollständige Konfigurationsdatei erforderlich.

  3. Stellen Sie die generierten Kubernetes-Schlüssel als Volumes bereit. Dabei können Sie sich an den Anweisungen zu Volumes auf der Kubernetes-Seite orientieren.

  4. Starten Sie den ESP wie auf der Seite ESP-Startoptionen beschrieben. Achten Sie jedoch darauf, das Start-Flag --ssl_port zu setzen, um den SSL-Port zu aktivieren. Der SSL-Standardport ist 443.

  5. Starten Sie den Dienst mit der aktualisierten Kubernetes-Konfigurationsdatei über den Befehl kubectl.

    kubectl apply -f esp_echo_gke.yaml

SSL-Zertifikate aktualisieren

SSL-Zertifikate sollten regelmäßig aktualisiert werden. Zum Aktualisieren von SSL-Zertifikaten führen Sie die folgenden Schritte aus:

  • Erstellen Sie wie in Schritt 1 oben beschrieben neue Zertifikate.
  • Stellen Sie die neuen Zertifikate wie in Schritt 3 oben beschrieben für die Kubernetes-Secrets bereit.
  • Aktualisieren Sie das ESP-Kubernetes-Deployment wie in Schritt 5 oben beschrieben.

SSL für ESP in Compute Engine aktivieren

Zum Aktivieren von SSL in Compute Engine kopieren Sie zuerst die Dateien nginx.key und nginx.crt in den Ordner /etc/nginx/ssl der Compute Engine-Instanz. Gehen Sie dabei so vor:

  1. Führen Sie den folgenden Befehl aus und ersetzen Sie INSTANCE_NAME durch den Namen Ihrer Compute Engine-Instanz:

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. Stellen Sie mit ssh eine Verbindung zur Instanz her.

    gcloud compute ssh INSTANCE-NAME
  3. Geben Sie im Feld für die Instanz-VM das Verzeichnis an und kopieren Sie die Dateien:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. Verwenden Sie für die Bereitstellung mit Docker die Anleitung für Ihren Diensttyp. Führen Sie den ESP-Docker-Container mit diesem Befehl aus:

    sudo docker run --name=esp \
     --detach \
     --publish=443:443 \
     --net=esp_net \
     --volume=/etc/nginx/ssl:/etc/nginx/ssl \
     --link=echo:echo \
     gcr.io/endpoints-release/endpoints-runtime:1 \
     --service=SERVICE_NAME \
     --rollout_strategy=managed \
     --backend=echo:8080 \
     --ssl_port=443

    Im Vergleich zum Befehl docker run ohne SSL erstellt die SSL-Version des Befehls eine andere Konfiguration. Beispiel für den SSL-Befehl:

    • Der Ordner mit den Schlüssel- und CRT-Dateien wird mit --volume im Container bereitgestellt.
    • Verwenden Sie --ssl_port=443, damit SSL von ESP auf Port 443 aktiviert wird.
    • Ändert das Flag --publish für die Portzuordnung.

SSL-Zertifikate aktualisieren

SSL-Zertifikate sollten regelmäßig aktualisiert werden. Zum Aktualisieren von SSL-Zertifikaten führen Sie die folgenden Schritte aus:

  • Erstellen Sie neue Zertifikate und kopieren Sie sie wie in Schritt 1 oben beschrieben nach VM-Instanzen.
  • Kopieren Sie die neuen Zertifikate wie in Schritt 3 oben beschrieben in das Verzeichnis /etc/esp/ssl.
  • Beenden Sie den ESP-Container mithilfe des Befehls sudo docker run und starten Sie ihn neu, wie in Schritt 4 oben beschrieben.

SSL-Port testen

Legen Sie die folgenden Umgebungsvariablen fest, um die Tests zu vereinfachen:

  1. Legen Sie für IP_ADDRESS die IP-Adresse der Compute Engine-Instanz mit dem neuen SSL-Zertifikat fest.

  2. Legen Sie für ENDPOINTS_KEY einen gültigen API-Schlüssel fest.

Nachdem Sie den SSL-Port aktiviert haben, können Sie mithilfe von HTTPS Anfragen an den Extensible Service Proxy senden: Wenn Sie ein selbst signiertes Zertifikat verwenden, aktivieren Sie mit -k die unsichere Option in curl:

curl -k -d '{"message":"hello world"}' -H "content-type:application/json" \
https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY

Alternativ können Sie das Zertifikat im Format pem generieren und das selbst signierte Zertifikat mithilfe der Option --cacert wie unten dargestellt in curl verwenden:

  openssl x509 -in nginx.crt -out nginx.pem -outform PEM
  curl --cacert "./nginx.pem" -d '{"message":"hello world"}' -H "content-type:application/json" \
  https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY