このページでは、Google Kubernetes Engine、Kubernetes、Compute Engine で Extensible Service Proxy V2(ESPv2)をデプロイする際に、セキュア ソケット レイヤ(SSL)ポートを有効にする方法を説明します。ユースケースによっては、デプロイされた Endpoints サービスの SSL ポートを有効にすることもおすすめします。
開始する前に、選択したサービスタイプと環境についてのチュートリアルを確認して、SSL なしで ESPv2 をデプロイする方法を理解しておいてください。
SSL 鍵と証明書を構成する
HTTPS リクエストを処理するように SSL ポートを構成するには、次の手順を行います。
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 handshake が失敗します。
Kubernetes で ESPv2 用の SSL を有効にする
Kubernetes で ESPv2 用の SSL ポートを有効にするには:
SSL 鍵と証明書を使用して Kubernetes secret を作成します。
kubectl create secret generic esp-ssl \ --from-file=./server.crt --from-file=./server.key
Kubernetes 構成ファイルを編集します。ここでは
echo-ssl.yaml
のスニペットの例を示しています。注: 構成のサンプルには、編集が必要な行が示されています。ファイルを Cloud Endpoints にデプロイするには、完全な構成ファイルが必要です。
作成した Kubernetes secret をボリュームとしてマウントします。手順については、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 Secret にマウントします。
- 上記のステップ 5 に従って、ESPv2 Kubernetes デプロイメントを更新します。
- 上記のステップ 6 に従って、クライアント証明書ルート ファイルを再生成します。
Compute Engine で ESPv2 用の SSL を有効にする
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
を使用して、/etc/esp/ssl
フォルダ内のサーバー証明書ファイルserver.key
とserver.crt
を検索するように ESPv2 に指示します。ポート マッピング フラグ
--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 を使用して 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 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