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 veicular 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

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

  • Se você usar o Cloud Load Balancing e os NEGs sem servidor para rotear o tráfego para seu aplicativo do App Engine, recomendamos mapear o domínio personalizado para o balanceador de carga, em vez de diretamente para seu aplicativo, e usar certificados SSL criados para o balanceador de carga. Isso elimina a necessidade de gerenciar certificados SSL separados para cada aplicativo sem servidor. Além disso, com o Cloud Load Balancing, é possível definir políticas SSL que controlam os recursos SSL que seu balanceador de carga negocia com os clientes. Para mais informações, consulte as seguintes páginas:

    Observe a limitação a seguir:

    • Recomendamos usar controles de entrada para que o aplicativo receba apenas solicitações enviadas do balanceador de carga (e da VPC, se você usá-la). Caso contrário, os usuários poderão usar o URL do App Engine do aplicativo para ignorar o balanceador de carga, as políticas de segurança do Google Cloud Armor, os certificados SSL e as chaves privadas transmitidas pelo balanceador de carga.

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. O certificado gerenciado é assinado pelo Google Trust Services (GTS) ou pela Let's Encrypt.

Para verificar se o certificado foi provisionado:

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

    Acessar a página "Domínios personalizados"

  2. A segurança SSL é exibida como gerenciada pelo Google.

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.

  • Verifique o status do seu certificado com a API Admin usando 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. Pode levar até 24 horas para que os registros DNS fiquem disponíveis.

  • 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 atualizar 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:

  1. No console do Google Cloud, 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 gerenciada.

Como desativar certificados SSL gerenciados

Para desativar certificados SSL gerenciados, siga as instruções abaixo:

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

    Acessar a página "Domínios personalizados"

  2. Selecione o domínio e clique em Desativar segurança gerenciada.

Como usar os 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 sobre 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 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. Verifique se você tem as permissões corretas no Console do Google Cloud e na propriedade verificada (etapa 3) de todos os domínios relacionados ou de seus 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 upload da chave privada e do certificado SSL e associe o domínio ao aplicativo:

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

      Acessar a página "Certificados SSL"

    2. Clique em Enviar um novo 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 o upload da chave privada RSA em Chave privada RSA não criptografada codificada em PEM, por exemplo, myserver.key.pem.
    4. Clique em Upload. Cada certificado SSL enviado fica visível e disponível para o uso de todos os demais projetos do Cloud. Assim, 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.

  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

Quando a data de validade de um certificado estiver próxima, será preciso fazer o 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 mais detalhes, consulte Como converter chaves privadas e concatenar os certificados SSL.

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

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

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

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

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 comando a seguir em um 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 é 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 informações a seguir:

      • 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.

      Os outros valores são todos opcionais.

  2. Determine qual autoridade de certificação funciona para você e, em seguida, compre um certificado. Por exemplo, é possível usar: a SSLMate, a Thawte, a Comodo (todas 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 conteúdo do seu arquivo CSR, siga as instruções para copiar e colar o conteúdo do arquivo .csr gerado anteriormente. Por exemplo, server.csr.

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

  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 a seguir:

    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 CA em um arquivo com o comando a seguir:

    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 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 se há 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 (ambos em inglês) retornam a mesma resposta.

    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 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 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 encadeados 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 encadeado, 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 curinga são compatíveis com apenas um nível de subdomínio.

Como remover certificados SSL personalizados

Para deixar de usar um certificado SSL personalizado, execute as seguintes etapas:

  1. No Console do Google Cloud, acesse a página de configurações de certificados SSL do App Engine.

    Acessar as configurações de certificado SSL

  2. Clique no certificado que você quer remover do domínio.

  3. Desmarque o nome de domínio para o qual você não quer mais usar o certificado SSL e clique em Salvar.

Como usar cabeçalhos Strict-Transport-Security

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

Como ver versões e criptografias TLS ativadas

  1. Instale o mapeador de rede nmap no seu computador, se ele ainda não estiver disponível. Consulte https://nmap.org/ (em inglês) para ver instruções de instalação.

  2. Para ver quais versões e criptografias TLS estão ativadas para o app, digite este comando:

    nmap -sV --script ssl-enum-ciphers -p 443 hostname

    Substitua hostname pelo nome do host do app. Use seu domínio personalizado ou o nome de host appspot.com que o App Engine criou para seu app. Por exemplo:

    nmap -sV --script ssl-enum-ciphers -p 443 example.uc.r.appspot.com

Como desativar as versões e criptografias do TLS

Se você usar o Cloud Load Balancing e os NEGs sem servidor para rotear o tráfego para seu aplicativo do App Engine, poderá desativar uma versão ou criptografia TLS definindo uma política de segurança SSL que especifica quais versões e criptografias TLS podem ser usadas em conexões HTTPS ou SSL.