使用 ESP 為 Cloud Endpoints 啟用安全資料傳輸層 (SSL)

本頁面說明如何在使用 Google Kubernetes Engine、Kubernetes 或 Compute Engine 部署 Extensible Service Proxy (ESP) 時,啟用安全通訊埠 (SSL) 通訊埠。在某些用途下,您可能需要為已部署的 Endpoints 服務啟用安全資料傳輸層 (SSL) 通訊埠。舉例來說,如果您使用 gRPC 的轉碼功能,可能會希望服務透過同一個通訊埠接收 HTTP 1.1 和 gRPC 要求。

開始前,請務必先查看所選服務類型和環境的教學課程,並瞭解如何在不使用 SSL 的情況下部署 ESP。

設定 SSL 金鑰和憑證

如要設定 SSL 通訊埠,以便傳送 HTTPS 要求,請按照下列步驟操作:

  1. 請確認 SSL 金鑰檔案的名稱為 nginx.key,憑證檔案的名稱為 nginx.crt。如要進行測試,可以使用 OpenSSL 搭配下列指令產生自行簽署的 nginx.keynginx.cert

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. 在伺服器憑證中同時指定 CNsubjectAltName。這些屬性的值應與用戶端用來呼叫服務的 DNS 或 IP 相符,否則 SSL 握手會失敗。

在 Kubernetes 啟用 ESP 的 SSL 功能

如要在 Kubernetes 啟用 ESP 的安全資料傳輸層 (SSL) 通訊埠:

  1. 使用您的 SSL 金鑰和憑證建立一個 Kubernetes 密鑰:

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. 編輯 Kubernetes 設定檔,例如 esp_echo_gke.yaml,如以下程式碼片段所示:

    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

    注意事項:設定範例會顯示需要編輯的文字行。如要將檔案部署至 Cloud Endpoints,必須要有完整的設定檔。

  3. 按照 Kubernetes 磁碟區頁面的指示,將您建立的 Kubernetes 密鑰掛接為磁碟區。

  4. 按照為 ESP 指定啟動選項一文所述的步驟啟動 ESP,不過請務必加入啟動參數 --ssl_port,才能啟用 SSL 通訊埠。(請注意,預設 SSL 通訊埠為 443。)

  5. 使用 kubectl 以更新後的 Kubernetes 設定檔啟動服務。

    kubectl apply -f esp_echo_gke.yaml

更新安全資料傳輸層 (SSL) 憑證

請務必定期更新 SSL 憑證。如要更新安全資料傳輸層 (SSL) 憑證,請務必執行下列步驟:

  • 按照上述步驟 1 的說明建立新的憑證。
  • 按照上述步驟 3 所述,將新的憑證掛接至 Kubernetes 密鑰。
  • 按照上述步驟 5 所述更新 ESP Kubernetes 部署作業。

在 Compute Engine 啟用 ESP 的安全資料傳輸層 (SSL) 功能

如要在 Google Compute Engine 啟用 SSL,請先按照下列步驟,將 nginx.keynginx.crt 檔案複製到 Compute Engine 執行個體的 /etc/nginx/ssl 資料夾中:

  1. 執行下列指令,並將 INSTANCE_NAME 替換為 Compute Engine 執行個體的名稱:

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. 使用 ssh 連線至執行個體。

    gcloud compute ssh INSTANCE-NAME
  3. 在執行個體 VM 方塊中建立目錄,然後將檔案複製到目錄中:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. 根據您的服務類型,按照操作說明使用 Docker 部署。執行 ESP Docker 容器時,請使用以下指令:

    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

    與非 SSL docker run 指令相比,SSL 版本的指令會建立不同的設定。例如,SSL 指令:

    • 使用 --volume 將包含金鑰和 CRT 檔案的資料夾掛接至容器
    • 使用 --ssl_port=443 告訴 ESP 在通訊埠 443 上啟用 SSL。
    • 變更通訊埠對應標記 --publish

更新安全資料傳輸層 (SSL) 憑證

請務必定期更新 SSL 憑證。如要更新安全資料傳輸層 (SSL) 憑證,請務必執行下列步驟:

  • 建立新的憑證,並按照上述步驟 1 的說明將其複製到 VM 執行個體。
  • 按照上述步驟 3 的說明,將新的憑證複製到 /etc/esp/ssl 目錄。
  • 使用 sudo docker run 指令停止及重新啟動 ESP 容器,如上方步驟 4 所述。

測試 SSL 連接埠

為簡化測試流程,請設定以下環境變數:

  1. IP_ADDRESS 設為擁有新 SSL 憑證的 Compute Engine 執行個體 IP 位址。

  2. ENDPOINTS_KEY 設為有效的 API 金鑰

啟用 SSL 通訊埠後,您可以使用 HTTPS 將要求傳送至可擴充服務 Proxy。如果您使用自行簽署的憑證,請使用 -k 開啟 curl 中的不安全選項:

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

或者,您也可以產生符合 pem 格式的憑證,然後使用 --cacert 選項,在 curl 中使用該自行簽署憑證,如下所示:

  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