Criar um modelo de certificado

Esta página descreve os atributos de um modelo de certificado e explica como criar um modelo de certificado.

Visão geral dos modelos de certificado

Certificate Authority Service fornece modelos reutilizáveis e parametrizados que podem ser usados em cenários comuns de emissão de certificados. Um modelo de certificado representa um esquema de emissão de certificados relativamente estático e bem definido em uma organização. O recurso CertificateTemplate inclui o seguinte:

  1. Uma expressão da Common Expression Language (CEL) que é avaliada em relação ao assunto e aos SANs solicitados em todas as solicitações de certificado que usam o modelo. Para mais informações sobre o uso da CEL, consulte Como usar a CEL.
  2. Uma lista de permissões que especifica se o assunto ou o nome alternativo do assunto pode ser copiado da solicitação do usuário final para o certificado emitido.
  3. Uma lista de permissões opcional que especifica quais extensões X.509, se houver, podem ser copiadas da solicitação do usuário final para o certificado emitido.
  4. Um conjunto opcional de valores de extensão X.509 que são adicionados a todos os certificados emitidos que usam o modelo.

Um modelo de certificado pode se tornar um framework completo de emissão de certificados. Para mais detalhes, consulte a definição completa da mensagem CertificateTemplate.

Valores predefinidos em um modelo de certificado

Os valores predefinidos em um modelo de certificado são adicionados a todos os certificados que usam o modelo. Eles permitem criar cenários comuns de emissão de certificados, como mTLS ou assinatura de código. Os valores incluem o seguinte:

  • Usos da chave: especifica o uso da chave base de um certificado de acordo com a seção 4.2.1.12 da RFC 5280.
  • Usos de chave estendidos: especifica o uso de chave estendido para um certificado de acordo com a seção 4.2.1.3 do RFC 5280.
  • Se o certificado é uma AC: especifica se o certificado pode emitir outros certificados ou se é um certificado de entidade final.
  • Tamanho máximo do caminho do emissor: no caso de uma AC, especifica o número máximo de ACs que podem ser encadeados a esse certificado de AC. Se o tamanho máximo do caminho do emissor for definido como 0, a AC só poderá emitir certificados de entidade final. Se estiver definido como 1, a cadeia abaixo desse certificado de AC poderá incluir apenas uma AC subordinada. Se um valor não for declarado, o número de ACs subordinados na cadeia abaixo dessa AC não terá limite.
  • Servidores OCSP do AIA: refere-se aos servidores OCSP na extensão de acesso a informações de autoridade (AIA) de um certificado, conforme descrito na seção 4.2.2.1 do RFC 5280.
  • Outras extensões X.509: descreve extensões X.509 personalizadas.

O exemplo de código a seguir menciona todos os campos predefinidos em um modelo de certificado:

keyUsage:
  baseKeyUsage:
    digitalSignature: true
    keyEncipherment: true
    contentCommitment: false
    dataEncipherment: false
    keyAgreement: false
    certSign: false
    crlSign: false
    encipherOnly: false
    decipherOnly: false
  extendedKeyUsage:
    serverAuth: true
    clientAuth: false
    codeSigning: false
    emailProtection: false
    timeStamping: false
    ocspSigning: false
caOptions:
  isCa: true
  maxIssuerPathLength: 1
policyIds:
- objectIdPath:
  - 1
  - 2
  - 3
additionalExtensions:
- objectId:
    objectIdPath:
    - 1
    - 2
    - 3
  critical: false
  value: "base64 encoded extension value"

Os valores não especificados no YAML são omitidos ou definidos como padrão como false.

As extensões a seguir são omitidas se um valor não for especificado:

  • keyUsage
  • policyIds
  • additionalExtensions
  • Campo maxIssuerPathLength na extensão caOptions

As extensões a seguir são definidas como false por padrão se um valor não for especificado:

  • Campo isCa na extensão caOptions

Criar um modelo de certificado

Para criar um modelo de certificado, use o seguinte comando gcloud:

gcloud

gcloud privateca templates create TEMPLATE_ID \
  --copy-subject \
  --copy-sans \
  --identity-cel-expression <expr> \
  --predefined-values-file FILE_PATH \
  --copy-all-requested-extensions \
  --copy-extensions-by-oid <1.2.3.4,5.6.7.8> \
  --copy-known-extensions <ext1,ext2>

Substitua:

  • TEMPLATE_ID: o identificador exclusivo do modelo de certificado.
  • FILE_PATH: o arquivo YAML que descreve os valores X.509 definidos pelo modelo de certificado.

A flag --copy-sans permite que a extensão do nome alternativo do assunto (SAN) da solicitação de certificado seja copiada para o certificado assinado. Como alternativa, especifique --no-copy-sans para remover todos os SANs especificados pelo autor da chamada da solicitação de certificado.

A flag --copy-subject permite que o assunto da solicitação de certificado seja copiado para o certificado assinado. Como alternativa, especifique --no-copy-subject para remover os sujeitos especificados pelo autor da chamada da solicitação de certificado.

A flag --identity-cel-expression usa uma expressão CEL que é avaliada em relação ao assunto e ao nome alternativo do assunto do certificado antes de ser emitida e retorna um booleano que indica se a solicitação deve ser permitida. Para saber como usar uma expressão da linguagem Common Expression Language (CEL) em um modelo de certificado, consulte Como usar a CEL em modelos de certificado.

A flag --predefined-values-file especifica o caminho para um arquivo YAML que descreve os valores X.509 predefinidos definidos por esse modelo. As extensões fornecidas são copiadas para todas as solicitações de certificado que usam esse modelo, tendo precedência sobre as extensões permitidas na solicitação de certificado. Se você atualizar qualquer parte dos valores X.509 predefinidos, a atualização vai substituir o conjunto inteiro dos valores X.509 predefinidos.

Se a flag --copy-all-requested-extensions estiver definida, todas as extensões especificadas na solicitação de certificado serão copiadas para o certificado assinado. Como alternativa, a flag --copy-extensions-by-oid pode ser usada para copiar OIDs específicos da solicitação de certificado para o certificado assinado, e a flag --copy-known-extensions pode ser usada para copiar extensões da solicitação de certificado para o certificado assinado. Precisa ser um dos seguintes formatos: base-key-usage, extended-key-usage, ca-options, policy-ids ou aia-ocsp-servers.

Remova a flag --copy-all-requested-extensions para ignorar todas as extensões X.509 na solicitação de certificado, mas mantenha os valores predefinidos definidos neste modelo.

Criar um modelo de certificado para cenários comuns

Esta seção fornece comandos gcloud para criar um modelo de certificado para casos de uso comuns.

Certificados TLS do servidor DNS para qualquer domínio

Para criar um modelo de certificado para emitir certificados TLS do servidor que permitam qualquer domínio, siga estas instruções:

  1. Crie um arquivo com o nome leaf_server_tls_values.yaml e adicione a seguinte configuração de TLS do servidor de entidade final a ele:

    leaf_server_tls_values.yaml

    keyUsage:
      baseKeyUsage:
        digitalSignature: true
        keyEncipherment: true
      extendedKeyUsage:
        serverAuth: true
    caOptions:
      isCa: false
    
  2. Para permitir apenas certificados com SANs do tipo DNS, execute o seguinte comando gcloud:

    gcloud

    gcloud privateca templates create server-tls \
      --predefined-values-file leaf_server_tls_values.yaml \
      --copy-sans --no-copy-subject \
      --identity-cel-expression "subject_alt_names.all(san, san.type == DNS)"
    

    Para mais informações sobre o comando gcloud privateca templates create, consulte gcloud privateca templates create.

Certificados TLS do servidor DNS com apenas domínios de teste

Para criar um modelo de certificado para emitir certificados TLS do servidor com SANs DNS limitados a domínios de teste, use o seguinte comando gcloud:

gcloud

gcloud privateca templates create server-tls \
  --predefined-values-file leaf_server_tls_values.yaml \
  --copy-sans --no-copy-subject \
  --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.test.example.com'))"

O conteúdo do arquivo leaf_server_tls_values.yaml precisa ser o mesmo do exemplo anterior.

Para mais informações sobre o uso de expressões CEL para garantir que os nomes de DNS comecem ou terminem com uma string específica, consulte Exemplos de expressões CEL.

Certificados de identidade da carga de trabalho

Para criar um modelo de certificado para emitir certificados TLS mútuos (mTLS), siga estas instruções:

  1. Crie um arquivo com o nome leaf_mtls_values.yaml e adicione a seguinte configuração TLS mútua de entidade final a ele.

    leaf_mtls_values.yaml

    keyUsage:
      baseKeyUsage:
        digitalSignature: true
        keyEncipherment: true
      extendedKeyUsage:
        serverAuth: true
        clientAuth: true
    caOptions:
      isCa: false
    
  2. Para permitir apenas certificados com SANs de URI SPIFFE, use o seguinte comando gcloud:

    gcloud

    gcloud privateca templates create workload-spiffe \
      --predefined-values-file leaf_mtls_values.yaml \
      --copy-sans --no-copy-subject \
      --identity-cel-expression "subject_alt_names.all(san, san.type == URI && san.value.startsWith('spiffe://'))"
    

    Para mais informações sobre o comando gcloud privateca templates create, consulte gcloud privateca templates create.

Para mais informações sobre o uso de expressões CEL para garantir que os nomes de DNS comecem ou terminem com uma string específica, consulte Exemplos de expressões CEL.

Conceder acesso ao modelo de certificado

Você pode usar um modelo de certificado se tiver a função de usuário do modelo de certificado de serviço de AC (roles/privateca.templateUser). Recomendamos que os autores de um modelo de certificado atribuam a função de usuário do modelo de certificado de serviço de CA aos membros da organização que possam usar esse modelo.

Para conceder o papel de usuário do modelo de certificado de serviço de CA (roles/privateca.templateUser) a todos no domínio example.com, use o seguinte comando gcloud:

gcloud

gcloud privateca templates add-iam-policy-binding TEMPLATE_ID \
  --member "domain:example.com" \
  --role "roles/privateca.templateUser"

Substitua:

  • TEMPLATE_ID: o identificador exclusivo do modelo de certificado.

Para mais informações sobre o comando gcloud privateca templates add-iam-policy-binding, consulte gcloud privateca templates add-iam-policy-binding.

Para mais informações sobre os papéis do IAM para o serviço de CA e as permissões associadas, consulte Controle de acesso com o IAM.

A seguir