Configurar TLS mútuo com certificados fornecidos pelo usuário

Nesta página, fornecemos instruções para criar um certificado raiz e um certificado intermediário assinado e fazer upload desses certificados para um recurso TrustConfig do Gerenciador de certificados. Se você já tiver certificados para fazer upload, pule as etapas a seguir para criar novos certificados.

Você também cria os recursos de segurança de rede necessários para configurar o TLS mútuo (mTLS) para balanceadores de carga de aplicativos. Nas instruções, usamos o OpenSSL para criar os certificados raiz e intermediários.

Antes de começar

Permissões

Para ter as permissões necessárias para concluir este guia, peça ao administrador para conceder a você os papéis do IAM a seguir no projeto:

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Também é possível conseguir as permissões necessárias com papéis personalizados ou outros papéis predefinidos.

Gere uma chave e certificados assinados

Esta seção usa comandos openssl para criar certificados raiz e intermediários.

Use os comandos a seguir para gerar um certificado raiz e um certificado intermediário assinado com campos keyUsage e extendedKeyUsage válidos.

  1. Crie um arquivo de amostra example.cnf com a configuração mínima necessária para criar certificados de assinatura válidos. É possível editar esse arquivo para definir campos adicionais nesses certificados.

    cat > example.cnf << EOF
    [req]
    distinguished_name = empty_distinguished_name
    [empty_distinguished_name]
    # Kept empty to allow setting via -subj command line arg.
    [ca_exts]
    basicConstraints=critical,CA:TRUE
    keyUsage=keyCertSign
    extendedKeyUsage=clientAuth
    EOF
    
  2. Crie o certificado raiz.

    openssl req -x509 \
        -new -sha256 -newkey rsa:2048 -nodes \
        -days 3650 -subj '/CN=root' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout root.key -out root.cert
    
  3. Crie a solicitação de assinatura do certificado intermediário.

    openssl req \
        -new -sha256 -newkey rsa:2048 -nodes \
        -subj '/CN=int' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout int.key -out int.req
    
  4. Crie o certificado intermediário.

    openssl x509 -req \
        -CAkey root.key -CA root.cert \
        -set_serial 1 \
        -days 3650 \
        -extfile example.cnf \
        -extensions ca_exts \
        -in int.req -out int.cert
    

Gerar um certificado da lista de permissões

Esta seção usa comandos openssl para criar uma amostra de certificado da lista de permissões.

Use os seguintes comandos para gerar um certificado da lista de permissões.

   openssl req -x509 \
       -new -sha256 -newkey rsa:2048 -nodes \
       -days 3650 -subj '/CN=localhost' \
       -keyout allowlisted.key -out allowlisted.cert

Formatar os certificados

Para incluir certificados novos ou atuais em um TrustStore, formate os certificados em uma única linha e armazene-os em variáveis de ambiente para que possam ser lidos no arquivo YAML. Use os seguintes comandos para formatar os certificados e armazená-los em variáveis de ambiente:

export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

Para incluir certificados da lista de permissões novos ou atuais em uma configuração de confiança, formate os certificados em uma única linha e armazene-os em variáveis de ambiente para que possam ser lidos no arquivo YAML. Use os seguintes comandos para formatar os certificados e armazená-los em variáveis de ambiente:

export ALLOWLISTED_CERT=$(cat allowlisted.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

Criar um recurso TrustConfig

Crie um recurso TrustConfig do Gerenciador de certificados que represente sua ICP. Este exemplo de recurso TrustConfig contém um armazenamento de confiança com duas âncoras de confiança e dois certificados de CA intermediários. Ele lê o conteúdo do certificado das variáveis de ambiente criadas na etapa anterior Formatar os certificados.

Para criar um repositório de confiança com âncoras de confiança adicionais ou certificados de CA intermediários, adicione linhas de pemCertificate na seção apropriada. Se você tiver menos âncoras de confiança ou certificados de CA intermediários, remova as linhas desnecessárias.

Este exemplo de recurso TrustConfig contém um certificado na lista de permissões. Especifique vários certificados na lista de permissões usando várias instâncias do campo pemCertificate.

Nas etapas a seguir, substitua TRUST_CONFIG_NAME pelo nome do recurso TrustConfig:

  1. Para criar o arquivo trust_config.yaml com um repositório de confiança, use o seguinte comando:

    cat << EOF > trust_config.yaml
    trustStores:
    - trustAnchors:
      - pemCertificate: "${ROOT_CERT?}"
      - pemCertificate: "${ROOT_CERT_2?}"
      intermediateCas:
      - pemCertificate: "${INTERMEDIATE_CERT?}"
      - pemCertificate: "${INTERMEDIATE_CERT_2?}"
    EOF
    
  2. Opcional: para criar o arquivo trust_config.yaml com um certificado na lista de permissões, use o seguinte comando:

    cat << EOF > trust_config.yaml
     allowlistedCertificates:
     - pemCertificate: "${ALLOWLISTED_CERT?}"
    EOF
    
  3. Para criar os recursos TrustConfig do Gerenciador de certificados, use o comando gcloud certificate-manager trust-configs import:

    global

    Para balanceadores de carga de aplicativo externos e balanceadores de carga de aplicativo internos entre regiões, use este comando:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml
    

    regional

    Use este comando para balanceadores de carga de aplicativo externos regionais e balanceadores de carga de aplicativo internos regionais:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml \
       --location=REGION
    

Criar os recursos de segurança de rede

Uma política de TLS do servidor (recurso de segurança de rede ServerTLSPolicy) permite especificar o modo TLS do lado do servidor e o recurso TrustConfig a ser usado ao validar certificados de cliente. 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.

  • Quando clientValidationMode é definido como ALLOW_INVALID_OR_MISSING_CLIENT_CERT, todas as solicitações são transmitidas para o back-end, mesmo que a validação falhe ou o certificado do cliente esteja ausente.
  • Quando clientValidationMode for definido como REJECT_INVALID, somente as solicitações que fornecerem um certificado de cliente que possa ser validado por um recurso TrustConfig serão transmitidas para o back-end.

Para criar o recurso ServerTLSPolicy, conclua as etapas a seguir:

  1. Com base em como você quer lidar com a conexão, selecione uma das opções a seguir.

    Nas etapas a seguir, substitua SERVER_TLS_POLICY_NAME pelo nome da política de TLS do servidor e PROJECT_ID pelo ID do projeto do Google Cloud.

    • Opção 1: clientValidationMode está definido como ALLOW_INVALID_OR_MISSING_CLIENT_CERT.

      Para criar o arquivo server_tls_policy.yaml, use o seguinte comando:

      global

      Para balanceadores de carga de aplicativo externos e internos entre regiões, use o comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regional

      Use o comando para balanceadores de carga de aplicativo externos regionais e balanceadores de carga de aplicativo internos regionais:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
    • Opção 2: clientValidationMode está definido como REJECT_INVALID.

      Para criar o arquivo server_tls_policy.yaml, use o seguinte comando:

      global

      Para balanceadores de carga de aplicativo externos e internos entre regiões, use o comando:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regional

      Use o comando para balanceadores de carga de aplicativo externos regionais e balanceadores de carga de aplicativo internos regionais:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
  2. Para criar o recurso ServerTlsPolicy, use o comando gcloud network-security server-tls-policies import:

    global

    Para balanceadores de carga de aplicativo externos e internos entre regiões, use o comando:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=global
    

    regional

    Use o comando para balanceadores de carga de aplicativo externos regionais e balanceadores de carga de aplicativo internos regionais:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=REGION
    

Para mais informações, consulte Modos de validação de cliente MTLS.

Assinar uma chave de cliente com o certificado intermediário

Nesta seção, fornecemos uma opção de configuração adicional para gerar um certificado de folha. Se você já criou um recurso TrustConfig usando certificados intermediários (int.cert e int.key), use as instruções a seguir:

  1. Crie um arquivo de configuração de chave de cliente.

    cat > client.config << EOF
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    
    [extension_requirements]
    basicConstraints          = critical, CA:FALSE
    keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage          = clientAuth
    
    [dn_requirements]
    countryName               = US
    stateOrProvinceName       = California
    localityName              = San Francisco
    0.organizationName        = example
    organizationalUnitName    = test
    commonName                = test.example.com
    emailAddress              = test@example.com
    
    EOF
    

    Se você quiser ter uma identidade SPIFFE anexada:

    • Adicione um subjectAltName à seção [extension_requirements] conforme a seguir:

      subjectAltName            = @sans_list
      
    • Adicione uma nova seção na parte de baixo do arquivo client.config com isto:

      [sans_list]
      URI.1                     = spiffe://example.com/test-identity
      
  2. Assine a chave.

    openssl req -new -keyout client.key -out client.csr -config client.config
    
    openssl x509 -req -in client.csr -out client.cert -extfile client.config -extensions extension_requirements -days 365 -CA int.cert -CAkey int.key
    
  3. Para testar, envie uma solicitação curl para o endereço IP do balanceador de carga.

    curl -v -k --key client.key --cert client.cert https://IP_ADDRESS
    

    Substitua IP_ADDRESS pelo endereço IP do balanceador de carga.

A seguir