このページでは、Google Kubernetes Engine、Kubernetes、または Compute Engine で Extensible Service Proxy(ESP)をデプロイするときにセキュア ソケット レイヤ(SSL)ポートを有効にする方法について説明します。ユースケースによっては、デプロイされた Endpoints サービスの SSL ポートを有効にすることもおすすめします。たとえば、gRPC のコード変換機能を使用している場合は、サービスに同じポートで HTTP 1.1 と gRPC の両方のリクエストを受け取らせることもできます。
開始する前に、選択したサービスタイプと環境についてのチュートリアルを確認して、SSL なしで ESP をデプロイする方法を理解しておいてください。
SSL 鍵と証明書を構成する
HTTPS リクエストを処理するように SSL ポートを構成するには、次の手順を行います。
SSL 鍵ファイルの名前は
nginx.key
で、証明書ファイルの名前はnginx.crt
であることをご確認ください。テスト用に、OpenSSL を使用して次のコマンドで自己署名nginx.key
とnginx.cert
を生成できます。openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ./nginx.key -out ./nginx.crt
CN
とsubjectAltName
の両方をサーバー証明書で指定します。これらの属性の値は、サービスを呼び出すためにクライアントが使用する DNS または IP と一致している必要があります。一致していない場合、SSL handshake が失敗します。
Kubernetes で ESP 用に SSL を有効にする
Kubernetes で ESP 用の SSL ポートを有効にするには:
SSL 鍵と証明書を使用して Kubernetes secret を作成します。
kubectl create secret generic nginx-ssl \ --from-file=./nginx.crt --from-file=./nginx.key
Kubernetes 構成ファイルを編集します。ここでは
esp_echo_gke.yaml
のスニペットの例を示しています。注: 構成のサンプルには、編集が必要な行が示されています。ファイルを Cloud Endpoints にデプロイするには、完全な構成ファイルが必要です。
作成した Kubernetes secret をボリュームとしてマウントします。手順については、Kubernetes のボリュームに関するページをご覧ください。
ESP の起動オプションの指定の手順に沿って ESP を起動します。ただし、必ず起動フラグ
--ssl_port
を追加して SSL ポートを有効にしてください(デフォルトの SSL ポートは 443 です)。kubectl
を使用して、更新した Kubernetes 構成ファイルでサービスを起動します。kubectl apply -f esp_echo_gke.yaml
SSL 証明書の更新
SSL 証明書を定期的に更新することが重要です。SSL 証明書を更新するには、次の手順を実施する必要があります。
- 上記のステップ 1 に従って、新しい証明書を作成します。
- 上記のステップ 3 の説明に従って、新しい証明書を Kubernetes Secret にマウントします。
- 上記のステップ 5 に従って、ESP Kubernetes のデプロイを更新します。
Compute Engine で ESP 用に SSL を有効にする
Compute Engine で SSL を有効にするには、以下の手順に従って、最初に nginx.key
ファイルと nginx.crt
ファイルを Compute Engine インスタンスの /etc/nginx/ssl
フォルダにコピーします。
次のコマンドを実行します。INSTANCE_NAME は、実際の Compute Engine インスタンスの名前に置き換えます。
gcloud compute scp nginx.* INSTANCE-NAME
ssh
を使用してインスタンスに接続します。gcloud compute ssh INSTANCE-NAME
インスタンスの VM ボックスで、ディレクトリを作成してファイルをそこにコピーします。
sudo mkdir -p /etc/esp/ssl
sudo cp server.* /etc/esp/ssl/
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
を使用して、ポート443
で SSL を有効にするよう ESP に指示します。- ポート マッピング フラグ
--publish
を変更します。
SSL 証明書の更新
SSL 証明書を定期的に更新することが重要です。SSL 証明書を更新するには、次の手順を実施する必要があります。
- 上記のステップ 1 に従って新しい証明書を作成し、VM インスタンスにコピーします。
- 上記のステップ 3 に従って、新しい証明書を
/etc/esp/ssl
ディレクトリにコピーします。 - 上記のステップ 4 に従い、
sudo docker run
コマンドを使用して、ESP コンテナを停止してから再起動します。
SSL ポートのテスト
テストをより簡単に実施できるように、次の環境変数を設定します。
IP_ADDRESS を、新しい SSL 証明書で実行されている Compute Engine インスタンスの IP アドレスに設定します。
ENDPOINTS_KEY を、有効な API キーに設定します。
SSL ポートを有効にした後は、HTTPS を使用して Extensible Service Proxy にリクエストを送信できます。証明書が自己署名されている場合は、curl
で -k
を使用し、安全でない接続を使うオプションを有効にするか、
curl -k -d '{"message":"hello world"}' -H "content-type:application/json" \ https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY
または、次に示すように、pem
フォーマットで証明書を生成し、curl
オプションを使用して、--cacert
自己署名証明書を使用します。
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