Como ativar o SSL para o Cloud Endpoints com o ESPv2

Nesta página, você aprende a ativar uma porta Secure Sockets Layer (SSL) ao implantar o Extensible Service Proxy V2 (ESPv2) com o Google Kubernetes Engine, Kubernetes ou Compute Engine. Talvez você queira ativar uma porta SSL para o serviço do Endpoints implantado em alguns casos de uso.

Antes de começar, leia os tutoriais sobre o tipo de serviço e ambiente escolhidos e saiba como implantar o ESPv2 sem SSL.

Como configurar chaves e certificados SSL

Para configurar a porta SSL para exibir solicitações HTTPS, siga as etapas abaixo:

  1. Verifique se o nome do arquivo de chave SSL é server.key e se o arquivo do certificado se chama server.crt. Para o teste, você pode gerar server.key e server.crt assinados automaticamente usando o OpenSSL com o seguinte comando:

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./server.key -out ./server.crt
  2. Especifique CN e subjectAltName no certificado do servidor. O valor desses atributos precisa corresponder ao DNS ou ao IP usado pelos clientes para chamar o serviço. Caso contrário, o handshake SSL falhará.

Como ativar o SSL para ESPv2 no Kubernetes

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

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

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

    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

    Observação: a amostra de configuração exibe as linhas que precisam ser editadas. Para implantar o arquivo no Cloud Endpoints é necessário o 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 ESPv2 conforme descrito em Como especificar opções de inicialização para o ESPv2, mas certifique-se de adicionar a sinalização de inicialização --ssl_server_cert_path para especificar o caminho para os arquivos de certificado ativados.

  5. Inicie o serviço com o arquivo de configuração atualizado do Kubernetes usando kubectl.

    kubectl apply -f echo-ssl.yaml

  6. Use o comando OpenSSL a seguir para gerar o certificado raiz do cliente:

       openssl x509 -in ./server.crt -out ./client.pem -outform PEM
     

    Se o cliente estiver usando curl, o arquivo client.pem poderá ser usado na sinalização --caroot. Para o gRPC, o client.pem é usado como o arquivo de certificado raiz da credencial SSL do canal gRPC.

Atualizar certificados SSL

É importante atualizar o certificado SSL periodicamente. Para atualizar seus certificados SSL, é necessário executar as seguintes etapas:

  • Crie novos certificados, conforme descrito na etapa 1 acima.
  • Ative os novos certificados nos secrets do Kubernetes, conforme descrito na etapa 3 acima.
  • Atualize a implantação do ESPv2 do Kubernetes, conforme descrito na etapa 5 acima.
  • Gere o arquivo de certificado raiz do cliente novamente, conforme descrito na etapa 6 acima.

Como ativar o SSL para o ESPv2 no Compute Engine

Para ativar o SSL no Compute Engine, primeiro copie os arquivos server.key e server.crt para a pasta /etc/nginx/ssl da instância do Compute Engine usando as seguintes etapas:

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

    gcloud compute scp server.* INSTANCE-NAME
    
  2. Conecte-se à instância usando ssh.

    gcloud compute ssh INSTANCE-NAME
    
  3. Na caixa "VM da instância", crie o diretório e copie os arquivos:

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. Siga as instruções para o tipo de serviço a implantar com o Docker. Quando você for executar o contêiner do Docker ESPv2, use este comando:

    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

    Em comparação com o comando docker run não SSL, a versão SSL do comando cria uma configuração diferente. Por exemplo, o comando SSL:

    • monta a pasta com arquivos de chave e CRT no contêiner usando --volume;
    • usa --ssl_server_cert_path=/etc/esp/ssl para informar ao ESPv2 para encontrar os arquivos de certificado do servidor server.key e server.crt na pasta /etc/esp/ssl;
    • altera a sinalização de mapeamento de porta --publish. As solicitações recebidas para a porta HTTPS 443 são mapeadas para a porta 9000 do ESPv2.

Atualizar certificados SSL

É importante atualizar o certificado SSL periodicamente. Para atualizar seus certificados SSL, é necessário executar as seguintes etapas:

  • Crie novos certificados e copie-os em instâncias de VM, conforme descrito na etapa 1 acima.
  • Copie os novos certificados para o diretório /etc/esp/ssl, conforme descrito na etapa 3 acima.
  • Interrompa e reinicie o contêiner do ESPv2 usando o comando sudo docker run, conforme descrito na etapa 4 acima.

Teste da porta SSL

Para facilitar o teste da porta SSL, 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.

  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 assinado automaticamente, use -k para ativar a opção não segura em curl:

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

Como alternativa, gere o certificado no formato pem e use a opção --cacert para usar o certificado assinado automaticamente em curl, como mostrado abaixo:

  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