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

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 ポートのテストをより簡単に実施できるように、次の環境変数を設定します。

  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
  

Google マネージド SSL 証明書を使用して SSL を有効にする

Google マネージド SSL 証明書の GKE サポートはベータ版です。Google マネージド SSL 証明書の使用の手順に従って SSL を構成します。

ベータ版のサービスに依存したくない場合は、GKE デプロイの ESP を認証局と直接統合できます。

次を使用できます。

詳細については、GitHub にある GKE での Let's Encrypt のチュートリアルをご覧ください。