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 鍵と証明書を構成する

HTTPS リクエストを処理するように SSL ポートを構成するには、次の手順を行います。

  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 handshake が失敗します。

Kubernetes で ESP 用に SSL を有効にする

Kubernetes で ESP 用の SSL ポートを有効にするには:

  1. SSL 鍵と証明書を使用して Kubernetes secret を作成します。

    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 secret をボリュームとしてマウントします。手順については、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 Secret にマウントします。
  • 上記のステップ 5 に従って、ESP Kubernetes のデプロイを更新します。

Compute Engine で ESP 用に SSL を有効にする

Compute Engine で SSL を有効にするには、以下の手順に従って、最初に nginx.key ファイルと nginx.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 を使用して、ポート 443 で SSL を有効にするよう ESP に指示します。
    • ポート マッピング フラグ --publish を変更します。

SSL 証明書の更新

SSL 証明書を定期的に更新することが重要です。SSL 証明書を更新するには、次の手順を実施する必要があります。

  • 上記のステップ 1 に従って新しい証明書を作成し、VM インスタンスにコピーします。
  • 上記のステップ 3 に従って、新しい証明書を /etc/esp/ssl ディレクトリにコピーします。
  • 上記のステップ 4 に従い、sudo docker run コマンドを使用して、ESP コンテナを停止してから再起動します。

SSL ポートのテスト

テストをより簡単に実施できるように、次の環境変数を設定します。

  1. IP_ADDRESS を、新しい SSL 証明書で実行されている Compute Engine インスタンスの IP アドレスに設定します。

  2. 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