Autenticação TLS mútua

Normalmente, com a comunicação HTTPS, a autenticação funciona apenas de uma maneira: o cliente verifica a identidade do servidor.

Para aplicativos que exigem que o balanceador de carga autentique a identidade dos clientes que se conectam a ele, use o TLS mútuo (mTLS).

Com o mTLS, o balanceador de carga solicita que o cliente envie um certificado para se autenticar durante o handshake de TLS com o balanceador de carga. É possível configurar um repositório de confiança que o balanceador de carga usa para validar a cadeia de confiança do certificado do cliente.

Os seguintes balanceadores de carga de aplicativo oferecem suporte a mTLS:

  • Balanceador de carga de aplicativo externo global
  • Balanceador de carga de aplicativo clássico
  • Balanceador de carga de aplicativo externo regional (pré-lançamento)
  • Balanceador de carga de aplicativo interno regional (pré-lançamento)
  • Balanceador de carga de aplicativo interno entre regiões

Arquitetura

Os recursos a seguir são necessários para que os balanceadores de carga ofereçam suporte a uma implantação de autenticação mTLS:

  • Um recurso de política de TLS do servidor (ServerTLSPolicy). Permite especificar o modo TLS do lado do servidor e o recurso TrustConfig a ser usado ao validar certificados do cliente. As políticas de TLS do servidor são compatíveis com a autenticação mTLS. As políticas de TLS do servidor podem ser anexadas ao recurso de proxy HTTPS de destino.

  • Um recurso TrustConfig. um recurso do Gerenciador de certificados TrustConfig contém um único recurso de armazenamento de confiança usado para validar certificados do cliente. Para mais informações, consulte Gerenciar configurações de confiança.

    É possível fazer upload de certificados da lista de permissões para o TrustConfig. Um certificado da lista de permissões sempre é considerado válido desde que seja analisável, a comprovação de posse da chave privada seja estabelecida e as restrições no campo SAN do certificado sejam atendidas. Os certificados expirados também são considerados válidos quando estão na lista de permissões.

  • Um armazenamento confiável. Contém os certificados de autoridade de certificação (CA, na sigla em inglês) âncora de confiança e intermediários que são usados para validar a cadeia de certificados do cliente. Uma CA é usada para emitir certificados confiáveis para o cliente. A CA é identificada pelo certificado raiz da âncora de confiança do balanceador de carga ou pelos certificados de CA intermediários.

    Você pode fazer o upload dos seguintes tipos de certificados do cliente para o repositório de confiança:

A imagem a seguir mostra os componentes do mTLS:

global

O diagrama a seguir mostra os componentes de uma implantação do balanceador de carga de aplicativo externo. Essa arquitetura também se aplica ao balanceador de carga de aplicativo interno entre regiões, que é um balanceador de carga de aplicativo interno que usa componentes globais.

TLS mútuo com componentes globais externos do balanceador de carga de aplicativo.
Figura 1. TLS mútuo com componentes globais externos do balanceador de carga de aplicativo (clique para ampliar).

regional

O diagrama a seguir mostra os componentes de uma implantação regional do balanceador de carga de aplicativo interno. Essa arquitetura também se aplica ao balanceador de carga de aplicativo externo regional, que é um balanceador de carga de aplicativo externo que usa componentes regionais.

TLS mútuo com componentes regionais internos do balanceador de carga de aplicativo.
Figura 1. TLS mútuo com componentes regionais internos do balanceador de carga de aplicativo (clique para ampliar).

Para mais informações sobre os componentes de uma implantação do balanceador de carga de aplicativo, consulte as seguintes seções:

Recursos

Os recursos com suporte do mTLS para balanceadores de carga permitem fazer o seguinte:

  • Verifique a prova de posse da chave privada do certificado apresentado pelo cliente.

  • Valide certificados de cliente em um dos dois modos:

    • Rejeite solicitações se não for possível validar a cadeia de certificados do cliente em relação a um armazenamento confiável.
    • Transmita todas as solicitações para o back-end, mesmo que elas não forneçam um certificado de cliente.
  • Realize a validação do certificado do cliente em relação a uma âncora PKI enviada. Compatibilidade com a adição de várias âncoras de ICP separadamente para facilitar a migração sem inatividade de uma ICP antiga para uma nova.

  • Forneça outros certificados intermediários para serem usados na criação do caminho de validação em âncoras de ICP especificadas. Os certificados intermediários permitem usar mTLS com clientes que não passam em toda a cadeia de certificados.

  • Gere e passe uma impressão digital do certificado para o back-end como um cabeçalho de solicitação personalizado.

  • Transmita os campos selecionados extraídos do certificado para o back-end usando cabeçalhos de solicitação personalizados.

  • Transmita o resultado e os erros de validação ao back-end usando cabeçalhos de solicitação personalizados.

Para uma descrição mais detalhada do processo de validação, consulte a seção Etapas de validação do certificado do cliente nesta página.

Modos de validação do cliente MTLS

Quando o cliente apresenta um certificado inválido ou nenhum certificado para o balanceador de carga, o clientValidationMode especifica como a conexão do cliente é processada.

Os valores de clientValidationMode são os seguintes:

  • ALLOW_INVALID_OR_MISSING_CLIENT_CERT permite a conexão do cliente mesmo que a validação da cadeia de certificados do certificado do cliente tenha falhado ou nenhum certificado do cliente tenha sido apresentado. O comprovante de posse da chave privada é sempre verificado quando o certificado do cliente é apresentado.

    É possível usar variáveis de cabeçalho personalizadas com esse modo para indicar ao back-end se o cliente forneceu um certificado, se a validação do certificado foi bem-sucedida e outras informações extraídas do certificado.

  • REJECT_INVALID rejeitará a conexão se um cliente não fornecer um certificado ou se a validação do certificado falhar.

É possível ver os registros para validação do certificado do cliente mTLS quando a geração de registros está ativada no serviço de back-end.

Valores de cabeçalho personalizados transmitidos para o back-end

A tabela a seguir mostra todos os valores de variáveis do cabeçalho personalizado TLS mútuo que são sempre transmitidos para o back-end (tipo de solicitação "Pass request to backend"). Os cabeçalhos personalizados são transmitidos para o back-end quando clientValidationMode é definido como ALLOW_INVALID_OR_MISSING_CLIENT_CERT ou quando o certificado do cliente passa na validação do certificado.

Status do certificado do cliente clientValidationMode Cabeçalhos personalizados

A cadeia de certificados do cliente é muito longa (mais de 10 certificados intermediários incluídos no certificado do cliente).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_exceeded_limit

client_cert_sha256_fingerprint: <cert hash>

Um cliente ou um certificado intermediário tem um tamanho de chave RSA inválido.

Nenhuma validação é executada.

As chaves RSA podem ter de 2.048 a 4.096 bits.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_invalid_rsa_key_size

client_cert_sha256_fingerprint: <cert hash>

Um cliente ou um certificado intermediário está usando uma curva elíptica não compatível.

Nenhuma validação é executada.

As curvas elípticas válidas são P-256 e P-384.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_elliptic_curve_key

client_cert_sha256_fingerprint: <cert hash>

Um cliente ou certificado intermediário está usando um algoritmo não RSA, não ECDSA.

Nenhuma validação é executada.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_key_algorithm

client_cert_sha256_fingerprint: <cert hash>

A ICP a ser usada para validação tem mais de dez certificados intermediários que compartilham as mesmas informações sobre o sujeito e sobre a chave pública do sujeito.

Nenhuma validação é executada.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_pki_too_large

client_cert_sha256_fingerprint: <cert hash>

Um certificado intermediário fornecido para validação tinha mais de 10 restrições de nome.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_max_name_constraints_exceeded

client_cert_sha256_fingerprint: <cert hash>

O certificado do cliente ou o emissor não tem Extended Key Usage (EKU) que inclui clientAuth

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_invalid_eku

client_cert_sha256_fingerprint: <cert hash>

O limite de tempo é excedido ao tentar validar a cadeia de certificados. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_timed_out

client_cert_sha256_fingerprint: <cert hash>

O limite de profundidade ou iteração é atingido ao tentar validar a cadeia de certificados.

A profundidade máxima de uma cadeia de certificados é dez, incluindo os certificados raiz e do cliente. O máximo de iterações é 100 (certificados examinados para validar a cadeia de certificados do cliente).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_search_limit_exceeded

client_cert_sha256_fingerprint: <cert hash>

Você configurou o mTLS sem configurar um recurso TrustConfig.

Nenhuma validação pode ser realizada, mas o hash do certificado é encaminhado para o back-end.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_not_performed

client_cert_sha256_fingerprint: <cert hash>

Nenhum certificado de cliente. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: false

client_cert_chain_verified: false

client_cert_error: client_cert_not_provided

client_cert_sha256_fingerprint: <empty>

A validação do certificado do cliente falha no recurso TrustConfig. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_failed

client_cert_sha256_fingerprint: <cert hash>

O certificado do cliente passa na validação do verificador do certificado. Não relevante

client_cert_present: true

client_cert_chain_verified: true

client_cert_error: <empty>

client_cert_sha256_fingerprint: <cert hash>

client_cert_serial_number: <serial_number>

client_cert_valid_not_before: <date>

client_cert_valid_not_after: <date>

client_cert_uri_sans: <list>

client_cert_dnsname_sans: <list>

client_cert_issuer_dn: <issuer>

client_cert_subject_dn: <subject>

client_cert_leaf: <certificate>

client_cert_chain: <list>

Erros registrados para conexões fechadas

Os erros a seguir resultam em uma conexão de cliente fechada quando clientValidationMode é definido como ALLOW_INVALID_OR_MISSING_CLIENT_CERT ou REJECT_INVALID. Para mais informações, consulte as mensagens de falha HTTP de statusDetails. Esses erros são registrados no Cloud Logging e descritos na tabela a seguir.

Status do certificado do cliente Solicitação Erro registrado
O certificado do cliente falha na correspondência da assinatura durante o handshake. Encerrar handshake de SSL Nenhum
O serviço não pode realizar a validação da cadeia de certificados. Encerrar conexão client_cert_validation_unavailable
Erro interno ao validar a cadeia de certificados. Encerrar conexão client_cert_validation_internal_error
TrustConfig não encontrado. Encerrar conexão client_cert_trust_config_not_found
O payload do certificado do cliente (incluindo certificados intermediários) é muito grande (mais de 16 KB). Encerrar conexão client_cert_exceeded_size_limit

Erros registrados com validação REJECT_INVALID

Os erros a seguir resultam em uma conexão fechada (tipo de solicitação "Encerrar conexão") quando clientValidationMode é definido como REJECT_INVALID. Para mais informações, consulte as mensagens de falha HTTP de statusDetails. Esses erros são registrados no Cloud Logging e descritos na tabela a seguir.

Status do certificado do cliente Erro registrado
A cadeia de certificados do cliente é muito longa (mais de 10 certificados intermediários incluídos no certificado do cliente). client_cert_chain_exceeded_limit

Um cliente ou um certificado intermediário tem um tamanho de chave RSA inválido.

Nenhuma validação é executada.

As chaves RSA podem ter de 2.048 a 4.096 bits.

client_cert_invalid_rsa_key_size

Um cliente ou um certificado intermediário está usando uma curva elíptica não compatível.

Nenhuma validação é executada.

As curvas válidas são P-256 e P-384.

client_cert_unsupported_elliptic_curve_key

Um cliente ou certificado intermediário está usando um algoritmo não RSA ou não ECDSA.

Nenhuma validação é executada.

client_cert_unsupported_key_algorithm

A ICP a ser usada para validação tem mais de dez certificados intermediários que compartilham as mesmas informações sobre o sujeito e sobre a chave pública do sujeito.

Nenhuma validação é executada.

client_cert_pki_too_large

Um certificado intermediário fornecido para validação tinha mais de 10 restrições de nome.

client_cert_chain_max_name_constraints_exceeded

O certificado do cliente ou o emissor não tem Extended Key Usage (EKU) que inclui clientAuth

client_cert_chain_invalid_eku

O limite de tempo é excedido ao tentar validar a cadeia de certificados. client_cert_validation_timed_out

O limite de profundidade ou iteração é atingido ao tentar validar a cadeia de certificados.

A profundidade máxima de uma cadeia de certificados é dez, incluindo os certificados raiz e do cliente. O número máximo de iterações é 100 (certificados examinados para validar a cadeia de certificados do cliente).

client_cert_validation_search_limit_exceeded
Você configurou o mTLS sem configurar um recurso TrustConfig. client_cert_validation_not_performed
O cliente não forneceu o certificado solicitado durante o handshake. client_cert_not_provided
A validação do certificado do cliente falha com o recurso TrustConfig. client_cert_validation_failed

Etapas de validação do certificado do cliente

Ao validar um certificado do cliente, o balanceador de carga executa as seguintes etapas:

  1. O balanceador de carga verifica a assinatura do cliente para provar que ele possui a chave privada do certificado do cliente. Se essa etapa falhar, o balanceador de carga sempre falhará o handshake de TLS, mesmo que sua configuração permita certificados de cliente inválidos ou ausentes e nenhuma informação seja registrada.
  2. Se a configuração incluir um TrustAnchor, o balanceador de carga verificará uma cadeia de confiança entre o certificado do cliente e o TrustAnchor configurado. Especificamente, o balanceador de carga verifica o seguinte:
    • Os certificados do cliente, intermediários e raiz estão em conformidade com os requisitos de certificado.
    • O campo de assunto nos certificados pai corresponde ao campo de problema nos certificados filhos.
    • O identificador de chave de assunto (SKID, na sigla em inglês) do certificado pai corresponde ao identificador de chave de autoridade (AKID, na sigla em inglês) no certificado filho.
    • O SAN de um certificado filho não viola o campo NameConstraints no certificado pai.
  3. Se a verificação da cadeia de confiança for bem-sucedida, a solicitação será encaminhada para o back-end com todos os cabeçalhos personalizados mTLS configurados para o endpoint.
  4. Se a verificação da cadeia de confiança falhar:
    • Se ClientValidationMode estiver definido como REJECT_INVALID, o balanceador de carga encerrará a conexão e registrará o motivo no Cloud Logging.
    • Se ClientValidationMode estiver definido como ALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE, o balanceador de carga ainda encaminhará a solicitação para o back-end. É possível usar cabeçalhos de solicitação personalizados para indicar ao back-end que a validação falhou e o motivo da falha. Para balanceadores de carga de aplicativo internos entre regiões, balanceadores de carga de aplicativo externos regionais ou balanceadores de carga de aplicativo internos regionais, além de cabeçalhos de solicitação personalizados, é possível configurar o mTLS campos opcionais para verificar o motivo da falha.

Requisitos de certificado

  • Os certificados precisam usar criptografia RSA ou ECDSA.
  • Para certificados de cliente (folha):
  • Para certificados raiz e intermediários:
    • A extensão Basic Constraints precisa conter CA=true.
    • A extensão Key Usage precisa ser definida como keyCertSign.
    • A extensão Extended Key Usage precisa conter o campo clientAuth. Isso é necessário para o certificado que emite o certificado do cliente.
    • O certificado não pode estar vencido.

Limitações

  • O balanceador de carga não executa verificações de revogação em certificados do cliente.

  • Os balanceadores de carga de aplicativo permitem fazer upload de uma configuração de confiança com um único repositório de confiança que contém no máximo 100 âncoras de confiança e 100 certificados intermediários e 500 certificados na lista de permissões. Os certificados intermediários não podem ter mais de três certificados que compartilham as mesmas informações de Assunto e de Chave pública do assunto. Para mais informações, consulte Cotas e limites.

  • A profundidade máxima de uma cadeia de certificados é dez, incluindo os certificados raiz e do cliente. O número máximo de vezes que os certificados intermediários podem ser avaliados ao tentar criar a cadeia de confiança é 100. Para mais informações, consulte Cotas e limites.

  • As chaves de certificados enviadas e passadas do cliente são restritas ao seguinte:

    • As chaves RSA podem ter de 2.048 a 4.096 bits. Para mais informações, consulte Cotas e limites.
    • As chaves ECDSA podem usar as curvas P-256 ou P-384.
  • A cadeia de certificados aceitos recebida do cliente está limitada a até 16 KB e 10 certificados. Para mais informações, consulte Cotas e limites.

  • Os certificados raiz usados para validação não podem conter mais de 10 restrições de nome. Para mais informações, consulte Cotas e limites.

  • Os certificados do cliente autoassinados são sempre considerados inválidos pelo balanceador de carga.

A seguir