本頁面說明如何在使用 Google Kubernetes Engine、Kubernetes 或 Compute Engine 部署 Extensible Service Proxy V2 (ESPv2) 時,啟用安全通訊埠 (SSL) 通訊埠。在某些用途下,您可能需要為已部署的 Endpoints 服務啟用安全資料傳輸層 (SSL) 通訊埠。
開始前,請確認您已查看所選服務類型和環境的教學課程,並且瞭解如何在不使用 SSL 的情況下部署 ESPv2。
設定 SSL 金鑰和憑證
如要設定 SSL 通訊埠,以便傳送 HTTPS 要求,請按照下列步驟操作:
請確認 SSL 金鑰檔案的名稱為
server.key
,憑證檔案的名稱為server.crt
。如要進行測試,可以使用 OpenSSL 搭配下列指令產生自行簽署的server.key
和server.crt
:openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./server.key -out ./server.crt
在伺服器憑證中同時指定
CN
和subjectAltName
。這些屬性的值應與用戶端用來呼叫服務的 DNS 或 IP 相符,否則 SSL 握手會失敗。
在 Kubernetes 上啟用 ESPv2 的 SSL 功能
如要在 Kubernetes 啟用 ESPv2 的 SSL 通訊埠:
使用您的 SSL 金鑰和憑證建立一個 Kubernetes 密鑰:
kubectl create secret generic esp-ssl \ --from-file=./server.crt --from-file=./server.key
編輯 Kubernetes 設定檔,例如
echo-ssl.yaml
,如以下程式碼片段所示:注意事項:設定範例會顯示需要編輯的文字行。如要將檔案部署至 Cloud Endpoints,必須要有完整的設定檔。
按照 Kubernetes 磁碟區頁面的指示,將您建立的 Kubernetes 密鑰掛接為磁碟區。
按照「為 ESPv2 指定啟動選項」一文所述的步驟啟動 ESPv2,不過請務必加入啟動標記
--ssl_server_cert_path
,才能指定已掛載憑證檔案的路徑。使用
kubectl
以更新後的 Kubernetes 設定檔啟動服務。kubectl apply -f echo-ssl.yaml
使用下列 OpenSSL 指令為用戶端產生根憑證:
openssl x509 -in ./server.crt -out ./client.pem -outform PEM
如果用戶端使用
curl
,檔案client.pem
可用於--caroot
旗標。針對 gRPC,client.pem
會用於 gRPC 管道的 SSL 憑證根憑證檔案。
更新安全資料傳輸層 (SSL) 憑證
請務必定期更新 SSL 憑證。如要更新安全資料傳輸層 (SSL) 憑證,請務必執行下列步驟:
- 按照上述步驟 1 的說明建立新的憑證。
- 按照上述步驟 3 所述,將新的憑證掛接至 Kubernetes 密鑰。
- 按照上述步驟 5 所述更新 ESPv2 Kubernetes 部署作業。
- 按照上述步驟 6 的說明重新產生用戶端根憑證檔案。
在 Compute Engine 上啟用 ESPv2 的 SSL 功能
如要在 Google Compute Engine 啟用 SSL,請先按照下列步驟,將 server.key
和 server.crt
檔案複製到 Compute Engine 執行個體的 /etc/nginx/ssl
資料夾中:
執行下列指令,並將 INSTANCE_NAME 替換為 Compute Engine 執行個體的名稱:
gcloud compute scp server.* INSTANCE-NAME
使用
ssh
連線至執行個體。gcloud compute ssh INSTANCE-NAME
在執行個體 VM 方塊中建立目錄,然後將檔案複製到目錄中:
sudo mkdir -p /etc/esp/ssl
sudo cp server.* /etc/esp/ssl/
根據您的服務類型,按照操作說明使用 Docker 部署。執行 ESPv2 Docker 容器時,請使用以下指令:
sudo docker run --name=esp \ --detach \ --publish=443:9000 \ --net=esp_net \ --volume=/etc/esp/ssl:/etc/esp/ssl \ gcr.io/endpoints-release/endpoints-runtime:2 \ --service=SERVICE_NAME \ --rollout_strategy=managed \ --backend=echo:8080 \ --ssl_server_cert_path=/etc/esp/ssl \ --listener_port=9000
與非 SSL
docker run
指令相比,SSL 版本的指令會建立不同的設定。例如,SSL 指令:- 使用
--volume
將包含金鑰和 CRT 檔案的資料夾掛接至容器。 - 使用
--ssl_server_cert_path=/etc/esp/ssl
告知 ESPv2 在/etc/esp/ssl
資料夾中尋找伺服器憑證檔案server.key
和server.crt
。 變更通訊埠對應標記
--publish
。傳入 HTTPS 通訊埠 443 的要求會對應至 ESPv2 通訊埠 9000。
- 使用
更新安全資料傳輸層 (SSL) 憑證
請務必定期更新 SSL 憑證。如要更新安全資料傳輸層 (SSL) 憑證,請務必執行下列步驟:
- 建立新的憑證,並按照上述步驟 1 的說明將其複製到 VM 執行個體。
- 按照上述步驟 3 的說明,將新的憑證複製到
/etc/esp/ssl
目錄。 - 如上方的步驟 4 所述,使用
sudo docker run
指令停止並重新啟動 ESPv2 容器。
測試 SSL 連接埠
為簡化 SSL 通訊埠的測試流程,請設定下列環境變數:
將 IP_ADDRESS 設為擁有新 SSL 憑證的 Compute Engine 執行個體 IP 位址。
將 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 server.crt -out client.pem -outform PEM
curl --cacert "./client.pem" -d '{"message":"hello world"}' -H "content-type:application/json" \ https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY