Como proteger domínios personalizados com SSL

O suporte de SSL para seu aplicativo do App Engine vai muito além do básico. Ele oferece endpoints SSL distribuídos globalmente e balanceamento de carga integrado para disponibilizar o app com segurança, confiabilidade e rapidez ao público no mundo todo.

Por padrão, as conexões HTTPS no domínio personalizado são ativadas automaticamente usando certificados SSL gerenciados. Depois que o domínio personalizado é associado ao aplicativo e os registros de DNS são configurados, o App Engine provisiona um certificado SSL gerenciado, processa a renovação do certificado antes que ele expire e o revoga quando você remove o domínio personalizado do aplicativo.

Antes de começar

Verificar se um certificado gerenciado foi provisionado

Alguns minutos após a configuração do domínio personalizado e a atualização dos registros de DNS, você receberá automaticamente um certificado SSL gerenciado. Ele é assinado pela Let's Encrypt (em inglês).

Para verificar se o certificado foi provisionado:

gcloud
  1. Execute o comando gcloud app domain-mappings a seguir para verificar se o certificado foi fornecido ao aplicativo do App Engine:

    gcloud app domain-mappings list
  2. Você verá uma lista de domínios, subdomínios e todos os certificados correspondentes. Por exemplo:

    ID               SSL_CERTIFICATE_ID
    example.com      123456
    www.example.com  234567
    Pode levar alguns minutos para o certificado ser provisionado. Durante esse período, o certificado aparece como PENDING_AUTO_CERT.

Solução de problemas dos certificados SSL gerenciados

  • Talvez seja necessário atualizar os registros de DNS do domínio personalizado para verificar o nome do domínio. No App Engine, não é possível provisionar certificados de domínios não verificados.

  • Para verificar o status do certificado com a API Admin, use uma solicitação AuthorizedCertificate.GET.

  • Se um certificado gerenciado não foi provisionado porque os registros DNS não estavam disponíveis, é possível que o campo ManagedCertificate.ManagementStatus seja FAILED_RETRYING_NOT_VISIBLE. Verifique se os registros DNS estão atualizados, aguarde alguns minutos e tente novamente. Os registros DNS podem demorar até 24 horas para serem disponibilizados.

  • Se o status for FAILED_PERMANENT, isso quer dizer que todas as tentativas de renovação falharam. Verifique as configurações de DNS e atualize o mapeamento do domínio personalizado. Basta seguir as etapas para fazer o upgrade para certificados SSL gerenciados.

Como fazer o upgrade para certificados SSL gerenciados

Antes de fazer upgrade para certificados SSL gerenciados pelo Google, é importante notar que eles não são compatíveis com mapeamentos de caracteres curinga.

Se você usa subdomínios, há um limite de 20 certificados gerenciados por semana para cada domínio de base. Quando esse limite é atingido, o App Engine continua tentando emitir certificados gerenciados até que todas as solicitações sejam atendidas.

Para trocar seus próprios certificados SSL por aqueles gerenciados pelo Google ou para adicionar certificados SSL gerenciados a um app com um domínio personalizado, atualize o mapeamento do domínio:

Console
  1. No Console do Google Cloud Platform, acesse App Engine > Configurações > Domínios personalizados:

    Acessar a página "Domínios personalizados"

  2. Selecione o domínio que você quer proteger e clique em Ativar segurança SSL.

    Ativar a segurança SSL na página "Domínios personalizados"

gcloud

Execute o comando gcloud app domain-mappings a seguir para atualizar o mapeamento do domínio para o aplicativo:

gcloud app domain-mappings update DOMAIN --certificate-management='AUTOMATIC'
API

Se você quiser atualizar o mapeamento de domínio de maneira programática para utilizar os certificados SSL gerenciados, consulte o método apps.domainMappings.patch na API Admin.

Como desativar certificados SSL gerenciados

Para fazer isso:

gcloud

É possível desativar um certificado SSL gerenciado que já está associado a um mapeamento de domínio. Você também pode escolher não usar um certificado SSL gerenciado ao mapear pela primeira vez o domínio personalizado.

  • Para remover um certificado de um mapeamento atual, execute o comando gcloud app domain-mappings a seguir:

    gcloud app domain-mappings update DOMAIN --certificate-management='MANUAL'
    
  • Para especificar a não utilização de um certificado SSL gerenciado ao mapear pela primeira vez um novo domínio personalizado para o aplicativo:

    gcloud app domain-mappings create DOMAIN --certificate-management='MANUAL'
    
API

Para desativar os certificados SSL gerenciados de maneira programática, especifique o gerenciamento manual do SSL com o método apps.domainMappings.patch na API Admin.

Como usar seus próprios certificados SSL

Em vez dos certificados SSL gerenciados, é possível usar seu próprio certificado. Se ele não tiver uma prova de transparência (em inglês), o aplicativo poderá exibir avisos de SSL no Chrome devido à aplicação da prova de transparência do certificado. Para mais informações sobre provas de transparência dos certificados e como ficar em conformidade, leia Como aplicar a transparência dos certificados (em inglês).

Para usar e gerenciar seus próprios certificados SSL, em vez dos gerenciados pelo Google:

  1. Verifique se você já configurou o domínio personalizado no projeto do App Engine.

  2. Desative os certificados padrão gerenciados pelo Google.

  3. Consiga um certificado para seu domínio emitido pela autoridade de certificação (CA, na sigla em inglês) da sua escolha. O mesmo procedimento pode variar dependendo da autoridade. No entanto, consulte Como conseguir um certificado para ver as etapas comuns.

  4. Converta a chave privada e os arquivos de certificado SSL para formatos aceitos pelo App Engine. Antes de fazer o upload dos arquivos, a chave privada precisa ser convertida para uma do tipo RSA. Além disso, é necessário concatenar os certificados SSL em um único arquivo. Para saber mais, consulte Como converter chaves privadas e concatenar os certificados SSL.

  5. Confira se você tem as permissões corretas no Console do GCP e se foi feita a verificação da propriedade (etapa 3) de todos os domínios relacionados ou dos respectivos domínios pai. Exemplo:

    • Se o certificado for para www.example.com, verifique a propriedade de www.example.com ou example.com.
    • Se o certificado for para www.example.com e sub.example.com, verifique a propriedade de www.example.com e sub.example.com ou de example.com.
    • Se o certificado for para *.example.com, verifique a propriedade de example.com.
  6. Faça o upload da chave privada e do certificado SSL e associe o domínio ao aplicativo:

    Console
    1. No Console do Google Cloud Platform, acesse App Engine > Configurações > Certificados SSL:

      Acessar a página "Certificados SSL"

    2. Clique em Enviar um novo certificado.

      Fazer o upload de um certificado
    3. Faça upload do certificado SSL concatenado em PEM encoded X.509 public key certificate, por exemplo, concat.crt. Em seguida, faça upload da chave privada RSA em Chave privada RSA não criptografada codificada em PEM, por exemplo, myserver.key.pem.
    4. Clique em Fazer o upload. Todo certificado SSL enviado fica visível e disponível para uso por todos os outros projetos do GCP. Dessa forma, você não precisa fazer upload do mesmo certificado repetidamente.
    5. Selecione o certificado que você quer atribuir a um domínio e clique em Salvar para usar SSL nele.
    gcloud
    1. Execute o comando gcloud app ssl-certificates a seguir para fazer upload do certificado SSL e da chave privada:
      gcloud app ssl-certificates create --display-name CERT_DISPLAY_NAME --certificate CERT_DIRECTORY_PATH --private-key KEY_DIRECTORY_PATH

      em que

      • CERT_DISPLAY_NAME é o nome de exibição escolhido para o certificado.
        Exemplo: example.com
      • CERT_DIRECTORY_PATH é o caminho do diretório e o nome do arquivo do certificado.
        Exemplo: ./cert.crt
      • KEY_DIRECTORY_PATH é o caminho do diretório e o nome do arquivo da chave privada.
        Exemplo: ./private.key

      Exemplo:

      gcloud app ssl-certificates create --display-name example.com --certificate ./cert.crt --private-key ./private.key
    2. Execute o comando gcloud app domain-mappings a seguir para criar o mapeamento entre seu domínio e o aplicativo do App Engine com SSL:
      gcloud app domain-mappings create DOMAIN --certificate-id CERT_ID

      em que

      • DOMAIN é o domínio a ser mapeado para o aplicativo do App Engine.
        Exemplo: *.example.com

        Dica: coloque o domínio entre aspas se você receber um erro ao usar o mapeamento curinga: '*.example.com'

      • CERT_ID é o ID de um certificado a ser usado para SSL.
        Exemplo: --certificate-id 1234

      Exemplo:

      gcloud app domain-mappings create '*.example.com' 1234

  7. Acesse o domínio no navegador usando https para testar as alterações. Por exemplo, https://www.example.com.

Como transferir os mapeamentos de um certificado em uso para um novo certificado

Quando a data de validade de um certificado estiver próxima, será preciso fazer upload de um novo e transferir para ele os mapeamentos do certificado antigo. O procedimento a seguir presume que o certificado atual ainda não expirou e que está em uso no domínio personalizado.

Para transferir os mapeamentos de um certificado em atividade:

  1. Consiga para o domínio um novo certificado emitido pela autoridade de certificação (CA, na sigla em inglês) da sua escolha. Consulte Como conseguir um certificado para ver os trâmites comuns.

  2. Converta a chave privada e os arquivos de certificado SSL para formatos aceitos pelo App Engine. Para saber mais detalhes, consulte Como converter chaves privadas e concatenar os certificados SSL.

  3. Faça o upload da chave privada RSA e do certificado SSL concatenado:

    Console
    1. Faça o upload do certificado SSL na página correspondente.

      Acessar a página "Certificados SSL"
      1. Clique em Enviar um novo certificado.

        Fazer o upload de um certificado
      2. Faça upload do certificado SSL concatenado em Certificado de chave pública X.509 codificado em PEM, como concat.crt, e depois da chave privada RSA em Chave privada RSA não criptografada codificada em PEM, como myserver.key.pem.
      3. Clique em Fazer o upload.
    2. Selecione o novo certificado que você adicionou usando a lista e escolha o domínio que está sendo disponibilizado pelo antigo.
    3. Clique em Salvar para transferir os mapeamentos do certificado antigo para o novo.
    gcloud

    Execute o comando gcloud app ssl-certificates a seguir para atualizar o certificado SSL e a chave privada:

    gcloud app ssl-certificates update CERT_ID --certificate CERT_DIRECTORY_PATH --private-key KEY_DIRECTORY_PATH

    em que

    • CERT_ID é o ID do certificado SSL que você quer atualizar.
      Exemplo: 1234
    • CERT_DIRECTORY_PATH é o caminho do diretório e o nome do arquivo do certificado SSL.
      Exemplo: ./cert.crt
    • KEY_DIRECTORY_PATH é o caminho do diretório e o nome do arquivo da chave privada.
      Exemplo: ./private.key

    Exemplo:

    gcloud app ssl-certificates update 1234 --certificate ./cert.crt --private-key ./private.key

Como conseguir um certificado

O processo para conseguir um certificado SSL varia de acordo com a autoridade de certificação que você usa. Talvez seja necessário ajustar um pouco as informações apresentadas aqui. Geralmente, cada autoridade de certificação fornece instruções para ajudar você durante o processo.

Para conseguir um certificado e usá-lo com o aplicativo do App Engine:

  1. Use a ferramenta openssl (em inglês) para gerar a chave privada e uma solicitação de assinatura de certificado (CSR, na sigla em inglês):

    1. Execute o seguinte comando no diretório em que você quer criar o arquivo server.csr:

      openssl req -nodes -newkey rsa:2048 -keyout [MY_PRIVATE_KEY].key -out [MY_CSR].csr
      

      em que

      • [MY_PRIVATE_KEY].key é o arquivo gerado em que a chave privada está armazenada. Exemplo: myserver.key.
      • [MY_CSR].csr é o arquivo gerado para a solicitação de assinatura do certificado. Exemplo: server.csr.
    2. Quando for solicitado, insira as seguintes informações:

      • Código de país com dois dígitos. Por exemplo, US para Estados Unidos.
      • Nome da cidade.
      • Nome da empresa. Use seu próprio nome se você não tiver uma.
      • Unidade organizacional ou NA, se não tiver uma.
      • Um nome comum que represente seu domínio. Por exemplo: www.example.com.
      • Endereço de e-mail.

      Não é necessário fornecer os outros valores, já que eles são opcionais.

  2. Determine qual autoridade de certificação funciona para você e, em seguida, compre um certificado. Por exemplo, é possível usar: SSLMate, Thawte, Comodo (conteúdo dos links em inglês) ou qualquer outra autoridade de certificação.

    Para ver detalhes sobre os tipos de certificados compatíveis, consulte o Suporte do App Engine para certificados SSL.

  3. Quando a CA solicitar o arquivo .csr gerado anteriormente, siga as instruções para copiar e colar o conteúdo. Por exemplo, server.csr.

  4. Siga as instruções quando a CA solicitar a aprovação do proprietário do domínio.

    Dica: pode ser mais fácil usar o método de aprovação por e-mail. Basta configurar um endereço de e-mail na conta do domínio, como admin@example.com. Assim, você recebe e responde a solicitação de aprovação da CA.

  5. Depois de fornecer a aprovação do proprietário do domínio, a CA envia o certificado para você. Ele normalmente está no formato .zip. Descompacte esse arquivo em um diretório de trabalho para concatenar os certificados e fazer upload para o App Engine.

Como converter chaves privadas e concatenar os certificados SSL

É preciso converter a chave privada em RSA e concatenar todos os certificados SSL antes de fazer upload da chave e dos certificados SSL no App Engine.

  1. Converta o arquivo de chave privada gerado anteriormente em uma chave privada RSA não criptografada. Por exemplo, execute o comando openssl rsa:

    openssl rsa -in [MY_PRIVATE_KEY].key -out [MY_RSA_KEY].key.pem
    

    em que

    • [MY_PRIVATE_KEY].key é o arquivo gerado que contém a chave privada armazenada. Exemplo: myserver.key.
    • [MY_RSA_KEY].key é o arquivo gerado que contém a chave privada RSA não criptografada. Exemplo: myserver.key.pem.

      Exemplo:

      openssl rsa -in myserver.key -out myserver.key.pem
      
  2. Concatene todos os arquivos .crt da sua CA em um único arquivo usando o seguinte comando:

    cat [MY_DOMAIN_CERT].crt [MY_SecureServerCA].crt [MY_TrustCA].crt [MY_TrustExternalCARoot].crt > [MY_CONCAT_CERT].crt
    

    em que

    • [MY_DOMAIN_CERT].crt é o certificado do seu domínio. Exemplo: www_example_com.crt.
    • [MY_SecureServerCA].crt, [MY_TrustCA].crt e [MY_TrustExternalCARoot].crt são os outros arquivos do certificado fornecidos pela CA.
    • [MY_CONCAT_CERT].crt é o arquivo concatenado que contém todos os arquivos .crt do certificado da sua CA. Exemplo: concat.crt.

      Exemplo:

      cat www_example_com.crt AddTrustExternalCARoot.crt RSADomainValidationSecureServerCA.crt RSAAddTrustCA.crt > concat.crt
      
  3. Verifique o certificado SSL e a chave privada:

    1. Para verificar a correspondência (em inglês) entre a chave privada e o certificado, use os comandos openssl x509 e openssl rsa. Exemplos:

      openssl x509 -noout -modulus -in concat.crt | openssl md5
      openssl rsa -noout -modulus -in myserver.key.pem | openssl md5
      

      Os comandos openssl x509 e openssl rsa (conteúdo dos links em inglês) retornam a mesma saída.

    2. Para verificar se um certificado e a rede de CA dele são válidos, use o comando openssl verify (em inglês). Exemplo:

      openssl verify -verbose -CAfile concat.crt concat.crt
      
  4. Quando tudo estiver pronto, faça o upload da chave privada RSA e dos certificados concatenados para o App Engine.

Suporte do App Engine para certificados SSL

O App Engine é compatível com os seguintes tipos de certificados:

  • Domínio/nome de host únicos
  • Autoassinados
  • Curinga
  • Nome alternativo do assunto (SAN, na sigla em inglês)/vários domínios

Isso inclui alguns requisitos para os certificados e chaves:

  • Você precisa fazer o upload da chave privada e do certificado no formato PEM.
  • As chaves privadas não podem ser criptografadas.
  • Um arquivo de certificado pode conter no máximo cinco certificados. Esse número inclui certificados em cadeia e intermediários.
  • Todos os nomes de assunto no certificado do host precisam corresponder ou serem subdomínios dos domínios verificados do usuário.
  • As chaves privadas precisam usar a criptografia RSA.
  • O módulo de chave máximo permitido é de 2.048 bits.

Se o certificado do host exigir um certificado intermediário ou em cadeia, que muitas autoridades de certificação emitem, você precisará anexá-los ao final do arquivo de certificado público.

Alguns recursos do App Engine usam subdomínios especiais. Por exemplo, um aplicativo pode usar subdomínios para lidar com serviços ou diferentes versões do aplicativo. Para usá-los com o SSL, configure um certificado SAN ou de caractere curinga. Os certificados de caractere curinga são compatíveis com apenas um nível de subdomínio.

Como usar cabeçalhos Strict Transport Security

Por motivos de segurança, todos os aplicativos precisam incentivar clientes a usar conexões https. É possível usar o cabeçalho Strict-Transport-Security para instruir o navegador a preferir https em vez de http.

Implemente o HTTP Strict Transport Security com cuidado: os clientes que tiverem recebido o cabeçalho anteriormente recusarão a conexão se https deixar de funcionar ou for desativado por qualquer motivo. Para saber mais, consulte a Folha de referência sobre HTTP Strict Transport Security (em inglês).

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

Enviar comentários sobre…

Ambiente padrão do App Engine para Java 8