Como proteger domínios personalizados com SSL

O suporte do SSL para o 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 aplicativo com segurança, confiabilidade e rapidez a um público mundial.

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ê recebe automaticamente um certificado SSL gerenciado. Ele é assinado pela Let's Encrypt.

Para verificar se o certificado foi provisionado:

gcloud
  1. Execute o comando gcloud app domain-mappings a seguir para verificar se o certificado foi provisionado para o 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.

  • Verifique o status do certificado com a API Admin usando uma solicitação AuthorizedCertificate.GET.

  • Se um certificado gerenciado não tiver sido provisionado porque os registros de DNS não estavam disponíveis, é possível que o campo ManagedCertificate.ManagementStatus seja FAILED_RETRYING_NOT_VISIBLE. Verifique se os registros de DNS estão atualizados, aguarde alguns instantes 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 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 de 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 no aplicativo:

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

Para atualizar o mapeamento de domínio de maneira programática e adotar 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. Ao mapear o domínio personalizado pela primeira vez, é possível optar por não usar um certificado SSL gerenciado.

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

    gcloud app domain-mappings update DOMAIN --certificate-management='MANUAL'
    
  • Para especificar que um certificado SSL gerenciado não seja usado 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 de maneira programática os certificados SSL gerenciados, especifique o gerenciamento manual do SSL com o método apps.domainMappings.patch na API Admin.

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 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. 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 mais informações, 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 (passo 3) de todos os domínios relacionados ou dos respectivos domínios pais. 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 de certificados SSL

    2. Clique em Fazer upload de um novo certificado.

      Fazer o upload de um certificado
    3. Faça o 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 em Chave privada RSA não criptografada codificada em PEM, por exemplo, myserver.key.pem.
    4. Clique em Fazer 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 o 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 de arquivo do certificado.
        Exemplo: ./cert.crt
      • KEY_DIRECTORY_PATH é o caminho do diretório e o nome de 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 o domínio e o aplicativo do App Engine com o SSL:
      gcloud app domain-mappings create DOMAIN --certificate-id CERT_ID

      em que:

      • DOMAIN é o domínio que você quer mapear 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 código do certificado que você quer usar para o 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 as etapas comuns.

  2. Converta a chave privada e os arquivos de certificado SSL para formatos aceitos pelo App Engine. Para ver 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 de certificados SSL
      1. Clique em Fazer upload de um novo certificado.

        Fazer o upload de um certificado
      2. Faça o upload do certificado SSL concatenado em Certificado de chave pública X.509 codificada em PEM, por exemplo, concat.crt. Em seguida, faça upload da chave em Chave privada RSA não criptografada codificada em PEM, por exemplo, myserver.key.pem.
      3. Clique em Fazer upload.
    2. Selecione o novo certificado que você adicionou usando a lista e escolha o domínio que está sendo atendido 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 código 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 usar 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. Por exemplo: server.csr.
    2. Quando for solicitado, insira as seguintes informações:

      • Código de país com 2 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 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 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 retornam a mesma saída.

    2. Use o comando openssl verify para verificar a validade de um certificado e a cadeia de CA dele. 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 2048 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 curinga. Os certificados curinga só oferecem suporte a 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 se tornar não funcional 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 flexível do App Engine para documentos .NET