为使用 ESP 的 Cloud Endpoints 启用 SSL

本页面介绍如何在将 Extensible Service Proxy (ESP) 部署到 Google Kubernetes Engine、Kubernetes 或 Compute Engine 时启用安全套接字层 (SSL) 端口。对于某些用例,您可能需要为已部署的 Endpoints 服务启用 SSL 端口。例如,如果您使用 gRPC 的转码功能,并且希望您的服务在同一端口上接收 HTTP 1.1 和 gRPC 请求。

开始之前,请确保您已阅读所选服务类型和环境的教程,并且了解如何在不使用 SSL 的情况下部署 ESP。

配置 SSL 密钥和证书

要配置 SSL 端口以处理 HTTPS 请求,请按以下步骤操作:

  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 握手将失败。

在 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 卷页面中的说明,将您创建的 Kubernetes Secret 作为卷进行装载。

  4. 按照指定 ESP 的启动选项中的说明启动 ESP,同时确保添加启动标志 --ssl_port 以启用 SSL 端口。(请注意,默认 SSL 端口为 443。)

  5. 运行 kubectl,使用更新后的 Kubernetes 配置文件来启动服务。

    kubectl apply -f esp_echo_gke.yaml

更新 SSL 证书

定期更新 SSL 证书非常重要。要更新 SSL 证书,您必须执行以下步骤:

  • 创建新证书,如上文步骤 1 所述。
  • 将新证书装载到 Kubernetes Secret,如上文步骤 3 所述。
  • 更新 ESP Kubernetes Deployment,如上文步骤 5 所述。

在 Compute Engine 上为 ESP 启用 SSL

要在 Compute Engine 上启用 SSL,请先将 nginx.keynginx.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. 在实例虚拟机框中,使用以下命令在文件中创建目录和副本:

      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 指示 ESP 在端口 443 上启用 SSL。
    • 更改端口映射标志 --publish

更新 SSL 证书

定期更新 SSL 证书非常重要。要更新 SSL 证书,您必须执行以下步骤:

  • 创建新证书并将其复制到虚拟机实例中,如上文步骤 1 所述。
  • 将新证书复制到 /etc/esp/ssl 目录中,如上文步骤 3 所述。
  • 使用 sudo docker run 命令停止并重启 ESP 容器,如上文步骤 4 所述。

测试 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 格式的证书,并使用 --cacert 选项在 curl 中使用自签名证书,如下所示:

  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