ESPv2 で Cloud Endpoints 用の SSL を有効にする

このページでは、Google Kubernetes Engine、Kubernetes、Compute Engine で Extensible Service Proxy V2(ESPv2)をデプロイする際に、セキュア ソケット レイヤ(SSL)ポートを有効にする方法を説明します。ユースケースによっては、デプロイされた Endpoints サービスの SSL ポートを有効にすることもおすすめします。

開始する前に、選択したサービスタイプと環境についてのチュートリアルを確認して、SSL なしで ESPv2 をデプロイする方法を理解しておいてください。

SSL 鍵と証明書を構成する

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

  1. SSL 鍵ファイルの名前は server.key で、証明書ファイルの名前は server.crt であることをご確認ください。テスト用に、OpenSSL を使用して次のコマンドで自己署名 server.keyserver.crt を生成できます。

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./server.key -out ./server.crt
  2. CNsubjectAltName の両方をサーバー証明書で指定します。これらの属性の値は、サービスを呼び出すためにクライアントが使用する DNS または IP と一致している必要があります。一致していない場合、SSL handshake が失敗します。

Kubernetes で ESPv2 用の SSL を有効にする

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

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

    kubectl create secret generic esp-ssl \
      --from-file=./server.crt --from-file=./server.key
  2. Kubernetes 構成ファイルを編集します。ここでは echo-ssl.yaml のスニペットの例を示しています。

    template:
      metadata:
        labels:
          app: esp-echo
      spec:
        volumes:
        - name: esp-ssl
          secret:
            secretName: esp-ssl
        containers:
        - name: esp
          image: gcr.io/endpoints-release/endpoints-runtime:2
          args: [
            "--listener_port", "9000",
            "--backend", "127.0.0.1:8081",
            "--service", "SERVICE_NAME",
            "--rollout_strategy", "managed",
            "--ssl_server_cert_path", "/etc/esp/ssl",
          ]
          ports:
            - containerPort: 9000
          volumeMounts:
          - mountPath: /etc/esp/ssl
            name: esp-ssl
            readOnly: true
        - name: echo
          image: gcr.io/endpoints-release/echo:latest
          ports:
            - containerPort: 8081

    : 構成のサンプルには、編集が必要な行が示されています。ファイルを Cloud Endpoints にデプロイするには、完全な構成ファイルが必要です。

  3. 作成した Kubernetes secret をボリュームとしてマウントします。手順については、Kubernetes のボリュームに関するページをご覧ください。

  4. ESPv2 の起動オプションの指定の手順に沿って、ESPv2 を起動します。ただし、必ず起動フラグ --ssl_server_cert_path を追加して、マウントされる証明書ファイルのパスを指定してください。

  5. kubectl を使用して、更新した Kubernetes 構成ファイルでサービスを起動します。

    kubectl apply -f echo-ssl.yaml

  6. クライアントのルート証明書は、次の 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 フォルダにコピーします。

  1. 次のコマンドを実行します。INSTANCE_NAME は、実際の Compute Engine インスタンスの名前に置き換えます。

    gcloud compute scp server.* 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 を使用してデプロイするには、サービスタイプに応じた手順に従います。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.keyserver.crt を検索するように ESPv2 に指示します。
    • ポート マッピング フラグ --publish を変更します。HTTPS ポート 443 への受信リクエストは、ESPv2 ポート 9000 にマッピングされます。

SSL 証明書の更新

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

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

SSL ポートのテスト

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