Como ativar o SSL para o Cloud Endpoints

Talvez seja necessário ativar uma porta SSL no serviço implantado do Endpoints. Por exemplo, quando você usa o recurso de transcodificação do gRPC e quer que o serviço receba solicitações HTTP 1.1 e gRPC na mesma porta. Neste documento, você verá como ativar a porta SSL ao implantar o Extensible Service Proxy (ESP) com o Google Kubernetes Engine e o Kubernetes ou o Compute Engine. Para isso, você precisa seguir os tutoriais sobre o tipo de serviço e ambiente escolhidos e saber como fazer a implantação sem o SSL.

Certificados e chaves SSL

Para ativar a porta SSL para que ela exiba solicitações HTTPS, os arquivos de chaves e certificados SSL precisam ter os nomes nginx.key e nginx.crt, respectivamente. Para testes, é possível gerar um nginx.key e nginx.cert autoassinados, basta usar o OpenSSL.

      openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
        -keyout ./nginx.key -out ./nginx.crt

Como ativar o SSL para ESP no Kubernetes

Para ativar a porta SSL para ESP no Kubernetes, siga as seguintes etapas:

  1. Crie um secret do Kubernetes com o certificado e a chave SSL:

      kubectl create secret generic nginx-ssl \
         --from-file=./nginx.crt --from-file=./nginx.key
    
  2. Edite os arquivos de configuração do Kubernetes, por exemplo, esp_echo_gke.yaml, conforme mostrado no snippet a seguir:

    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

    Observação: a amostra de configuração exibe as linhas que precisam ser editadas. Para implantar o arquivo no Cloud Endpoints, você precisa do arquivo de configuração completo.

  3. Ative os secrets do Kubernetes criados como volumes seguindo as instruções da página de volumes do Kubernetes (em inglês).

  4. Inicie o ESP conforme descrito em Como especificar opções de inicialização para o ESP. Certifique-se de incluir a sinalização de inicialização --ssl_port para ativar a porta SSL. A padrão é 443.

  5. Use o kubectl para iniciar o serviço com o arquivo de configuração atualizado do Kubernetes.

    kubectl create -f esp_echo_gke.yaml
    

Como ativar o SSL para ESP no Compute Engine

Para ativar o SSL no Compute Engine, primeiro copie os arquivos crt e de chave para a pasta /etc/nginx/ssl da instância do Compute Engine da seguinte forma:

  1. Execute o seguinte comando e substitua INSTANCE_NAME pelo nome da instância do Compute Engine:

    gcloud compute scp nginx.* INSTANCE-NAME:
    
  2. Use ssh para se conectar à instância.

    gcloud compute ssh INSTANCE-NAME
    

  3. Na caixa "VM da instância", crie o diretório e copie os arquivos:

      sudo mkdir -p /etc/nginx/ssl
      sudo cp nginx.* /etc/nginx/ssl/
    

Siga as instruções para o tipo de serviço a implantar com o Docker. Quando você for executar o contêiner do Docker ESP, use 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

Ao comparar o comando não SSL docker run com a versão SSL dele, você verá as seguintes diferenças:

  • Ativa a pasta com arquivos de chave e CRT no contêiner usando --volume.
  • Usa --ssl_port=443 para informar o ESP para ativar o SSL na porta 443.
  • A sinalização do mapeamento de porta --publish foi alterada.

Como testar a porta SSL

Para facilitar o teste, defina as seguintes variáveis de ambiente:

  1. Defina IP_ADDRESS como o endereço IP da instância do Compute Engine com o novo certificado SSL.

    Nos dois exemplos, supomos que o servidor ainda não tenha um nome de domínio totalmente qualificado (FQDN, na sigla em inglês). Portanto, a suposição implícita é que ${IP_ADDRESS} foi usado como FQDN ao gerar o certificado autoassinado. Quando o servidor receber um FQDN, use-o para gerar o certificado e, nos dois exemplos abaixo, substitua ${IP_ADDRESS} por ele.

  2. Defina ENDPOINTS_KEY como uma chave de API válida.

Com a porta SSL ativada, você pode usar HTTPS para enviar solicitações ao Extensible Service Proxy. Se o certificado for autoassinado, use -k para ativar a opção desprotegida em curl:

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

Se preferir, gere o certificado no formato pem e use a opção --cacert para utilizar o autoassinado em 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}

Como ativar o SSL usando o Let's Encrypt

O GKE não oferece uma solução HTTPS pronta para uso ou certificados TLS/SSL para sites. É possível usar:

Para mais informações, veja o tutorial Let's Encrypt on GKE (em inglês) no GitHub.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Cloud Endpoints com gRPC
Precisa de ajuda? Acesse nossa página de suporte.