Criar uma autoridade certificadora subordinada

Nesta página, descrevemos como criar autoridades certificadoras (CAs) subordinadas em um pool de CAs.

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

Antes de começar

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

Criar uma CA subordinada

É mais fácil revogar e girar CAs subordinadas do que CAs raiz. Se você tiver vários cenários de emissão de certificados, poderá criar uma CA 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 mais alto.

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

Console

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

    Acesse Certificate Authority Service

  2. Clique na guia Gerenciador de CA.

  3. Clique em Criar CA.

    Crie uma CA usando o console do Cloud.

Selecione o tipo de CA

  1. Clique em CA subordinada.
  2. Clique em A CA raiz está no Google Cloud.
  3. No campo Válido por, insira a duração em que você quer que o certificado da CA seja válido.
  4. Opcional: escolha o nível da CA. 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 a AC. Para mais informações, consulte Locais.
  6. Opcional: em Estado inicializado, selecione o estado em que a CA precisa estar no momento da criação.
  7. Opcional: em Configurar um cenário de emissão, clique em Perfil de certificado e selecione na lista o perfil que melhor atende aos seus requisitos. 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 ou unidade de negócios da empresa.
  3. Opcional: no campo Nome do país (C), insira um código de país de 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 CA (CN), insira o nome da CA.
  7. Clique em Continuar.
Configurar o tamanho e o algoritmo da chave da CA
  1. Escolha o algoritmo de chave que melhor atende às suas necessidades. Para informações sobre como decidir o algoritmo de chave adequado, consulte Escolher um algoritmo de chave.
  2. Clique em Continuar.
Configurar artefatos de CA
  1. Escolha se você quer usar um bucket do Cloud Storage gerenciado pelo Google ou pelo cliente.
    1. Para um bucket do Cloud Storage gerenciado pelo Google, o CA Service cria um bucket gerenciado pelo Google no mesmo local da CA.
    2. Para um bucket do Cloud Storage gerenciado pelo cliente, clique em "Procurar" e selecione um dos buckets do Cloud Storage atuais.
  2. Clique em Continuar.
Adicionar rótulos

As etapas a seguir são opcionais.

Se você quiser adicionar rótulos à CA, 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 Continuar.
Revise as configurações

Revise todas as configurações com atenção e clique em Concluído para criar a CA.

gcloud

  1. Crie um pool de CA para a CA subordinada:

    gcloud privateca pools create SUBORDINATE_POOL_ID --location=LOCATION
    

    Substitua:

    • SUBORDINATE_POOL_ID: o nome do pool de ACs.
    • LOCATION: o local onde você quer criar o pool de ACs. Para a lista completa de locais, consulte Locais.

    Para mais informações sobre como criar 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 CA subordinada no pool de CA criado.

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

    A seguinte instrução é retornada quando a CA 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 CA subordinada cujo emissor está localizado no serviço de CA 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 CA subordinada

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

Console

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

    Acesse Certificate Authority Service

  2. Clique na guia Gerenciador de CA.

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

  4. Clique em Ativar.

  5. Na caixa de diálogo que aparece, clique em Fazer o download da CSR para baixar o arquivo da CSR codificado por PEM que a CA 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 CA subordinada recém-criada, execute o seguinte comando:

gcloud privateca subordinates enable SUBORDINATE_CA_ID \
--pool=SUBORDINATE_POOL_ID \
--location=LOCATION

Substitua:

  • SUBORDINATE_CA_ID: o identificador exclusivo da CA subordinada.
  • SUBORDINATE_POOL_ID: o nome do pool de ACs que contém a CA subordinada.
  • LOCATION: o local do pool de ACs. Para a lista completa de locais, consulte Locais.

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 CA subordinada e execute terraform apply.

A seguir