Criar uma autoridade certificadora subordinada

Esta página descreve como criar autoridades certificadoras (ACs) subordinadas em um pool de ACs.

As ACs subordinadas são responsáveis por emitir certificados diretamente para entidades finais, como usuários, computadores e dispositivos. As ACs subordinadas são assinadas criptograficamente por uma AC mãe, que geralmente é a AC raiz. Como resultado, os sistemas que confiam na AC raiz confiam automaticamente nas ACs subordinadas e nos certificados de entidade final que elas emitem.

Antes de começar

  • Verifique se você tem o papel do IAM de Gerente de operações de serviço de CA (roles/privateca.caManager) ou de administrador de serviço de CA (roles/privateca.admin). Para mais informações, consulte Configurar políticas do IAM.
  • Criar um pool de CA.
  • Selecione a raiz da CA.

Criar uma AC subordinada

As ACs subordinadas são mais fáceis de revogar e rotacionar do que as ACs raiz. Se você tiver vários cenários de emissão de certificados, poderá criar uma AC subordinada para cada um deles. Adicionar várias ACs subordinadas a um pool de ACs ajuda você a conseguir um melhor balanceamento de carga das solicitações de certificado e um QPS total efetivo maior.

Para criar uma AC subordinada, faça o seguinte:

Console

  1. Acesse a página Serviço de autoridade certificadora no console do Google Cloud.

    Acesse Certificate Authority Service

  2. Clique na guia Gerenciador de ACs.

  3. Clique em Criar AC.

    Crie uma AC usando o console do Cloud.

Selecionar o tipo de CA

  1. Clique em CA subordinada.
  2. Clique em A AC raiz está no Google Cloud.
  3. No campo Válido por, insira o período de validade do certificado de AC.
  4. Opcional: escolha o nível da AC. O nível padrão é Enterprise. Para mais informações, consulte Selecionar os níveis de operação.
  5. Clique em Região para selecionar um local para o AC. Saiba mais em Locais.
  6. Opcional: em Estado inicializado, selecione o estado em que a AC precisa estar na criação.
  7. Opcional: em Configurar um cenário de emissão, clique em Perfil de certificado e selecione o perfil de certificado que melhor se adapta aos seus requisitos na lista. Para mais informações, consulte Perfis de certificado.
  8. Clique em Próxima.
Configurar o nome do assunto da CA
  1. No campo Organização (O), insira o nome da sua empresa.
  2. Opcional: no campo Unidade organizacional (UO), insira a subdivisão da empresa ou a unidade de negócios.
  3. Opcional: no campo Nome do país, insira um código de país com duas letras.
  4. Opcional: no campo Nome do estado ou da província, insira o nome do seu estado.
  5. Opcional: no campo Nome da localidade, insira o nome da sua cidade.
  6. No campo Nome comum da AC (CN), insira o nome da AC.
  7. No campo ID do pool, insira o nome do pool de ACs. Não é possível mudar o pool de ACs depois de criar a AC.
  8. Clique em Próxima.
Configurar o tamanho e o algoritmo da chave da CA
  1. Escolha o algoritmo de chave que melhor atenda às suas necessidades. Para informações sobre como decidir o algoritmo de chave adequado, consulte Escolher um algoritmo de chave.
  2. Clique em Próxima.
Configurar artefatos de CA

As etapas a seguir são opcionais. Se você pular essas etapas, as configurações padrão serão aplicadas.

  1. Escolha se você quer usar um bucket do Cloud Storage gerenciado pelo Google ou gerenciado por você.
  2. Se você não selecionar um bucket autogerenciado do Cloud Storage, o CA Service vai criar um bucket gerenciado pelo Google no mesmo local que a AC.

  3. Escolha se você quer desativar a publicação de listas de revogação de certificados (CRLs) e certificados de AC no bucket do Cloud Storage.
  4. A publicação de CRL e do certificado de AC em um bucket do Cloud Storage é ativada por padrão. Para desativar essas configurações, clique nos botões.

  5. Clique em Próxima.
Adicionar rótulos

As etapas a seguir são opcionais.

Se você quiser adicionar rótulos à AC, faça o seguinte:

  1. Clique em Adicionar item.
  2. No campo Chave 1, insira a chave do rótulo.
  3. No campo Valor 1, insira o valor do rótulo.
  4. Se quiser adicionar outro rótulo, clique em Adicionar item. Em seguida, adicione a chave e o valor do rótulo, conforme mencionado nas etapas 2 e 3.
  5. Clique em Próxima.
Revisar as configurações

Revise todas as configurações com cuidado e clique em Criar para criar a AC.

gcloud

  1. Crie um pool de ACs para a AC subordinada:

    gcloud privateca pools create SUBORDINATE_POOL_ID
    

    Substitua SUBORDINATE_POOL_ID pelo nome do pool de ACs.

    Para mais informações sobre a criação de pools de ACs, consulte Criar um pool de ACs.

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

  2. Crie uma AC subordinada no pool de ACs criado.

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
      --pool=SUBORDINATE_POOL_ID \
      --issuer-pool=POOL_ID \
      --key-algorithm="ec-p256-sha256" \
      --subject="CN=Example Server TLS CA, O=Example LLC"
    

    A declaração a seguir é retornada quando a AC subordinada é criada.

    Created Certificate Authority [projects/my-project-pki/locations/us-west1/caPools/SUBORDINATE_POOL_ID/certificateAuthorities/SUBORDINATE_CA_ID].
    

    Para conferir uma lista completa de configurações, execute o seguinte comando gcloud:

    gcloud privateca subordinates create --help
    

    O comando retorna exemplos para criar uma AC subordinada cujo emissor está localizado no serviço de AC ou em outro lugar.

Terraform

resource "google_privateca_certificate_authority" "root_ca" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                                   = "my-pool"
  certificate_authority_id               = "my-certificate-authority-root"
  location                               = "us-central1"
  deletion_protection                    = false # set to true to prevent destruction of the resource
  ignore_active_certificates_on_deletion = true
  config {
    subject_config {
      subject {
        organization = "ACME"
        common_name  = "my-certificate-authority"
      }
    }
    x509_config {
      ca_options {
        # is_ca *MUST* be true for certificate authorities
        is_ca = true
      }
      key_usage {
        base_key_usage {
          # cert_sign and crl_sign *MUST* be true for certificate authorities
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
  // valid for 10 years
  lifetime = "${10 * 365 * 24 * 3600}s"
}

resource "google_privateca_certificate_authority" "sub_ca" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                     = "my-sub-pool"
  certificate_authority_id = "my-certificate-authority-sub"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  subordinate_config {
    certificate_authority = google_privateca_certificate_authority.root_ca.name
  }
  config {
    subject_config {
      subject {
        organization = "ACME"
        common_name  = "my-subordinate-authority"
      }
    }
    x509_config {
      ca_options {
        is_ca = true
        # Force the sub CA to only issue leaf certs.
        # Use e.g.
        #    max_issuer_path_length = 1
        # if you need to chain more subordinates.
        zero_max_issuer_path_length = true
      }
      key_usage {
        base_key_usage {
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
        }
      }
    }
  }
  // valid for 5 years
  lifetime = "${5 * 365 * 24 * 3600}s"
  key_spec {
    algorithm = "RSA_PKCS1_2048_SHA256"
  }
  type = "SUBORDINATE"
}

Java

Para autenticar no serviço de CA, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


import com.google.api.core.ApiFuture;
import com.google.cloud.security.privateca.v1.CaPoolName;
import com.google.cloud.security.privateca.v1.CertificateAuthority;
import com.google.cloud.security.privateca.v1.CertificateAuthority.KeyVersionSpec;
import com.google.cloud.security.privateca.v1.CertificateAuthority.SignHashAlgorithm;
import com.google.cloud.security.privateca.v1.CertificateAuthorityServiceClient;
import com.google.cloud.security.privateca.v1.CertificateConfig;
import com.google.cloud.security.privateca.v1.CertificateConfig.SubjectConfig;
import com.google.cloud.security.privateca.v1.CreateCertificateAuthorityRequest;
import com.google.cloud.security.privateca.v1.KeyUsage;
import com.google.cloud.security.privateca.v1.KeyUsage.KeyUsageOptions;
import com.google.cloud.security.privateca.v1.Subject;
import com.google.cloud.security.privateca.v1.SubjectAltNames;
import com.google.cloud.security.privateca.v1.X509Parameters;
import com.google.cloud.security.privateca.v1.X509Parameters.CaOptions;
import com.google.longrunning.Operation;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateSubordinateCa {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    // location: For a list of locations, see:
    // https://cloud.google.com/certificate-authority-service/docs/locations
    // poolId: Set it to the CA Pool under which the CA should be created.
    // subordinateCaName: Unique name for the Subordinate CA.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    String subordinateCaName = "subordinate-certificate-authority-name";

    createSubordinateCertificateAuthority(project, location, poolId, subordinateCaName);
  }

  public static void createSubordinateCertificateAuthority(
      String project, String location, String poolId, String subordinateCaName)
      throws IOException, ExecutionException, InterruptedException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `certificateAuthorityServiceClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (CertificateAuthorityServiceClient certificateAuthorityServiceClient =
        CertificateAuthorityServiceClient.create()) {

      String commonName = "commonname";
      String orgName = "csr-org-name";
      String domainName = "dns.example.com";
      int caDuration = 100000; // Validity of this CA in seconds.

      // Set the type of Algorithm.
      KeyVersionSpec keyVersionSpec =
          KeyVersionSpec.newBuilder().setAlgorithm(SignHashAlgorithm.RSA_PKCS1_4096_SHA256).build();

      // Set CA subject config.
      SubjectConfig subjectConfig =
          SubjectConfig.newBuilder()
              .setSubject(
                  Subject.newBuilder().setCommonName(commonName).setOrganization(orgName).build())
              // Set the fully qualified domain name.
              .setSubjectAltName(SubjectAltNames.newBuilder().addDnsNames(domainName).build())
              .build();

      //  Set the key usage options for X.509 fields.
      X509Parameters x509Parameters =
          X509Parameters.newBuilder()
              .setKeyUsage(
                  KeyUsage.newBuilder()
                      .setBaseKeyUsage(
                          KeyUsageOptions.newBuilder().setCrlSign(true).setCertSign(true).build())
                      .build())
              .setCaOptions(CaOptions.newBuilder().setIsCa(true).build())
              .build();

      // Set certificate authority settings.
      CertificateAuthority subCertificateAuthority =
          CertificateAuthority.newBuilder()
              .setType(CertificateAuthority.Type.SUBORDINATE)
              .setKeySpec(keyVersionSpec)
              .setConfig(
                  CertificateConfig.newBuilder()
                      .setSubjectConfig(subjectConfig)
                      .setX509Config(x509Parameters)
                      .build())
              // Set the CA validity duration.
              .setLifetime(Duration.newBuilder().setSeconds(caDuration).build())
              .build();

      // Create the CertificateAuthorityRequest.
      CreateCertificateAuthorityRequest subCertificateAuthorityRequest =
          CreateCertificateAuthorityRequest.newBuilder()
              .setParent(CaPoolName.of(project, location, poolId).toString())
              .setCertificateAuthorityId(subordinateCaName)
              .setCertificateAuthority(subCertificateAuthority)
              .build();

      // Create Subordinate CA.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient
              .createCertificateAuthorityCallable()
              .futureCall(subCertificateAuthorityRequest);

      Operation response = futureCall.get();

      if (response.hasError()) {
        System.out.println("Error while creating Subordinate CA !" + response.getError());
        return;
      }

      System.out.println(
          "Subordinate Certificate Authority created successfully : " + subordinateCaName);
    }
  }
}

Python

Para autenticar no serviço de CA, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

import google.cloud.security.privateca_v1 as privateca_v1
from google.protobuf import duration_pb2


def create_subordinate_ca(
    project_id: str,
    location: str,
    ca_pool_name: str,
    subordinate_ca_name: str,
    common_name: str,
    organization: str,
    domain: str,
    ca_duration: int,
) -> None:
    """
    Create Certificate Authority (CA) which is the subordinate CA in the given CA Pool.
    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
        ca_pool_name: set it to the CA Pool under which the CA should be created.
        subordinate_ca_name: unique name for the Subordinate CA.
        common_name: a title for your certificate authority.
        organization: the name of your company for your certificate authority.
        domain: the name of your company for your certificate authority.
        ca_duration: the validity of the certificate authority in seconds.
    """

    ca_service_client = privateca_v1.CertificateAuthorityServiceClient()

    # Set the type of Algorithm
    key_version_spec = privateca_v1.CertificateAuthority.KeyVersionSpec(
        algorithm=privateca_v1.CertificateAuthority.SignHashAlgorithm.RSA_PKCS1_4096_SHA256
    )

    # Set CA subject config.
    subject_config = privateca_v1.CertificateConfig.SubjectConfig(
        subject=privateca_v1.Subject(
            common_name=common_name, organization=organization
        ),
        # Set the fully qualified domain name.
        subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain]),
    )

    # Set the key usage options for X.509 fields.
    x509_parameters = privateca_v1.X509Parameters(
        key_usage=privateca_v1.KeyUsage(
            base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                crl_sign=True,
                cert_sign=True,
            )
        ),
        ca_options=privateca_v1.X509Parameters.CaOptions(
            is_ca=True,
        ),
    )

    # Set certificate authority settings.
    certificate_authority = privateca_v1.CertificateAuthority(
        type_=privateca_v1.CertificateAuthority.Type.SUBORDINATE,
        key_spec=key_version_spec,
        config=privateca_v1.CertificateConfig(
            subject_config=subject_config,
            x509_config=x509_parameters,
        ),
        # Set the CA validity duration.
        lifetime=duration_pb2.Duration(seconds=ca_duration),
    )

    ca_pool_path = ca_service_client.ca_pool_path(project_id, location, ca_pool_name)

    # Create the CertificateAuthorityRequest.
    request = privateca_v1.CreateCertificateAuthorityRequest(
        parent=ca_pool_path,
        certificate_authority_id=subordinate_ca_name,
        certificate_authority=certificate_authority,
    )

    operation = ca_service_client.create_certificate_authority(request=request)
    result = operation.result()

    print(f"Operation result: {result}")

Ativar uma AC subordinada

Para ativar uma AC subordinada, faça o seguinte:

Console

  1. Acesse a página Certificate Authority Service no console do Google Cloud.

    Acesse Certificate Authority Service

  2. Clique na guia Gerenciador de ACs.

  3. Em Autoridades de certificação, selecione a AC que você quer ativar.

  4. Clique em Ativar.

  5. Na caixa de diálogo que abrir, clique em Fazer o download da CSR para fazer o download do arquivo CSR codificado por PEM que a AC emissora pode assinar.

  6. Clique em Próxima.

  7. No campo Fazer upload da cadeia de certificados, clique em Procurar.

  8. Faça upload do arquivo de certificado assinado com a extensão .crt.

  9. Clique em Ativar.

gcloud

Para ativar uma AC subordinada recém-criada, execute o seguinte comando:

gcloud privateca subordinates enable SUBORDINATE_CA_ID --pool=SUBORDINATE_POOL_ID

Substitua:

  • SUBORDINATE_CA_ID: o identificador exclusivo da AC subordinada.
  • SUBORDINATE_POOL_ID: o nome do pool de ACs que contém a AC subordinada.

Para mais informações sobre o comando gcloud privateca subordinates enable, consulte gcloud privateca subordinates enable.

Terraform

Defina o campo desired_state como ENABLED na AC subordinada e execute terraform apply.

A seguir