Habilitar SSL para Cloud Endpoints con ESP

En esta página se explica cómo habilitar un puerto de Secure Sockets Layer (SSL) al desplegar Extensible Service Proxy (ESP) con Google Kubernetes Engine, Kubernetes o Compute Engine. En algunos casos prácticos, puede que quieras habilitar un puerto SSL para el servicio Endpoints implementado. Por ejemplo, si utilizas la función de transcodificación de gRPC, puede que quieras que tu servicio reciba solicitudes HTTP 1.1 y gRPC en el mismo puerto.

Antes de empezar, asegúrate de haber consultado los tutoriales del tipo de servicio y el entorno que hayas elegido, y de saber cómo implementar ESP sin SSL.

Configurar las claves y los certificados SSL

Para configurar el puerto SSL para que responda a solicitudes HTTPS, sigue estos pasos:

  1. Comprueba que el archivo de clave SSL se llama nginx.key y el archivo de certificado, nginx.crt. Para hacer pruebas, puedes generar un nginx.key y un nginx.cert autofirmados con OpenSSL mediante el siguiente comando:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. Especifica tanto CN como subjectAltName en tu certificado de servidor. El valor de estos atributos debe coincidir con el DNS o la IP que usan los clientes para llamar a tu servicio. De lo contrario, se producirá un error en el handshake SSL.

Habilitar SSL para ESP en Kubernetes

Para habilitar el puerto SSL de ESP en Kubernetes, sigue estos pasos:

  1. Crea un secreto de Kubernetes con tu clave y certificado SSL:

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. Edita los archivos de configuración de Kubernetes, por ejemplo, esp_echo_gke.yaml, como se muestra en el siguiente fragmento:

    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

    Nota: En el ejemplo de configuración se muestran las líneas que se deben editar. Para desplegar el archivo en Cloud Endpoints, se necesita el archivo de configuración completo.

  3. Monta los secretos de Kubernetes que has creado como volúmenes siguiendo las instrucciones de la página de volúmenes de Kubernetes.

  4. Inicia ESP como se describe en Especificar opciones de inicio para ESP, pero asegúrate de añadir la marca de inicio --ssl_port para habilitar el puerto SSL. Ten en cuenta que el puerto SSL predeterminado es 443.

  5. Inicia el servicio con el archivo de configuración de Kubernetes actualizado mediante kubectl.

    kubectl apply -f esp_echo_gke.yaml

Actualizar certificados SSL

Es importante que actualices tus certificados SSL periódicamente. Para actualizar tus certificados SSL, debes seguir estos pasos:

  • Crea nuevos certificados, tal como se describe en el paso 1 de este artículo.
  • Monta los nuevos certificados en los secretos de Kubernetes, tal como se describe en el paso 3 anterior.
  • Actualiza la implementación de Kubernetes de ESP, tal como se describe en el paso 5 anterior.

Habilitar SSL para ESP en Compute Engine

Para habilitar SSL en Compute Engine, primero copia los archivos nginx.key y nginx.crt en la carpeta /etc/nginx/ssl de tu instancia de Compute Engine. Para ello, sigue estos pasos:

  1. Ejecuta el siguiente comando y sustituye INSTANCE_NAME por el nombre de tu instancia de Compute Engine:

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. Conéctate a la instancia mediante ssh.

    gcloud compute ssh INSTANCE-NAME
  3. En el cuadro de la VM de la instancia, crea el directorio y copia los archivos:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. Sigue las instrucciones correspondientes a tu tipo de servicio para implementar con Docker. Cuando ejecutes el contenedor Docker de ESP, usa este comando:

    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

    En comparación con el comando docker run no compatible con SSL, la versión compatible con SSL del comando crea una configuración diferente. Por ejemplo, el comando SSL:

    • Monta la carpeta con los archivos de clave y CRT en el contenedor mediante --volume
    • Usa --ssl_port=443 para indicar a ESP que habilite SSL en el puerto 443.
    • Cambia la marca de asignación de puertos --publish.

Actualizar certificados SSL

Es importante que actualices tus certificados SSL periódicamente. Para actualizar tus certificados SSL, debes seguir estos pasos:

  • Crea certificados y cópialos en las instancias de VM, tal como se describe en el paso 1 de este artículo.
  • Copia los nuevos certificados en el directorio /etc/esp/ssl, tal como se describe en el paso 3 anterior.
  • Detén y reinicia el contenedor ESP con el comando sudo docker run, tal como se describe en el paso 4 anterior.

Probar el puerto SSL

Para facilitar las pruebas, define las siguientes variables de entorno:

  1. Define IP_ADDRESS como la dirección IP de la instancia de Compute Engine con el nuevo certificado SSL.

  2. Asigna a ENDPOINTS_KEY una clave de API válida.

Una vez que se haya habilitado el puerto SSL, podrá usar HTTPS para enviar solicitudes al proxy de servicio extensible. Si tu certificado tiene firma automática, usa -k para activar la opción no segura en curl:

curl -k -d '{"message":"hello world"}' -H "content-type:application/json" \
https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY

También puedes generar el certificado en formato pem y usar la opción --cacert para usar el certificado autofirmado en curl, como se muestra a continuación:

  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