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.key と server.crt を生成できます。

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./server.key -out ./server.crt
  2. CN と subjectAltName の両方をサーバー証明書で指定します。これらの属性の値は、サービスを呼び出すためにクライアントが使用する 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.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 ポートのテストをより簡単に実施できるように、次の環境変数を設定します。

  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