Crie uma autoridade de certificação subordinada

Esta página descreve como criar autoridades de certificação (ACs) subordinadas num grupo de ACs.

As ACs subordinadas são responsáveis pela emissão de certificados diretamente para entidades finais, como utilizadores, computadores e dispositivos. As CAs subordinadas são assinadas criptograficamente por uma CA principal, que é frequentemente a CA de raiz. Como resultado, os sistemas que confiam na CA de raiz confiam automaticamente nas CAs subordinadas e nos certificados de entidade final que as CAs subordinadas emitem.

Antes de começar

  • Certifique-se de que tem a função do IAM de gestor de operações do serviço de AC (roles/privateca.caManager) ou administrador do serviço de AC (roles/privateca.admin). Para mais informações, consulte o artigo Configure políticas de IAM.
  • Crie um conjunto de ACs.
  • Selecione a sua AC de raiz.

Crie uma CA subordinada

É mais fácil revogar e alternar CAs subordinados do que CAs de raiz. Se tiver vários cenários de emissão de certificados, pode criar uma AC subordinada para cada um desses cenários. A adição de várias ACs subordinadas num conjunto de ACs ajuda a alcançar um melhor equilíbrio de carga dos pedidos de certificados e um total mais elevado de CPS eficazes.

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

Consola

  1. Aceda à página Serviço de autoridade de certificação na Google Cloud consola.

    Aceda ao serviço de autoridade de certificação

  2. Clique no separador Gestor de AC.

  3. Clique em Criar AC.

    Crie uma AC através da Cloud Console.

Selecione o tipo de CA

  1. Clique em CA subordinado.
  2. Clique em A AC de raiz está no Google Cloud.
  3. No campo Válido durante, introduza a duração durante a qual quer que o certificado da AC seja válido.
  4. Opcional: escolha o nível da CA. O nível predefinido é Enterprise. Para mais informações, consulte o artigo Selecione os níveis de operação.
  5. Clique em Região para selecionar uma localização para a CA. Para mais informações, consulte Localizações.
  6. Opcional: em Estado inicializado, selecione o estado em que o CA tem de estar no momento da 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 adequa aos seus requisitos na lista. Para mais informações, consulte os perfis de certificados.
  8. Clicar em Seguinte.
Configure o nome do assunto da AC
  1. No campo Organização (O), introduza o nome da sua empresa.
  2. Opcional: no campo Unidade organizacional (UO), introduza a subdivisão da empresa ou a unidade empresarial.
  3. Opcional: no campo Nome do país (C), introduza um código do país de duas letras.
  4. Opcional: no campo Nome do estado ou da província, introduza o nome do seu estado.
  5. Opcional: no campo Nome da localidade, introduza o nome da sua cidade.
  6. No campo Nome comum (CN) da AC, introduza o nome da AC.
  7. Clique em Continuar.
Configure o tamanho da chave e o algoritmo da AC
  1. Escolha o algoritmo de chave que melhor se adapta às suas necessidades. Para obter informações sobre como decidir o algoritmo de chave adequado, consulte Escolha um algoritmo de chave.
  2. Clique em Continuar.
Configure artefactos da CA
  1. Escolha se quer usar um contentor do Cloud Storage gerido pela Google ou pelo cliente.
    1. Para um contentor do Cloud Storage gerido pela Google, o serviço de AC cria um contentor gerido pela Google na mesma localização que a AC.
    2. Para um contentor do Cloud Storage gerido pelo cliente, clique em Procurar e selecione um dos contentores do Cloud Storage existentes.
  2. Clique em Continuar.
Adicione etiquetas

Os passos seguintes são opcionais.

Se quiser adicionar etiquetas à CA, faça o seguinte:

  1. Clique em Adicionar item.
  2. No campo Chave 1, introduza a chave da etiqueta.
  3. No campo Valor 1, introduza o valor da etiqueta.
  4. Se quiser adicionar outra etiqueta, clique em Adicionar item. Em seguida, adicione a chave e o valor da etiqueta, conforme mencionado nos passos 2 e 3.
  5. Clique em Continuar.
Reveja as definições

Reveja cuidadosamente todas as definições e, de seguida, clique em Concluído para criar a CA.

gcloud

  1. Crie um grupo de CAs para a CA subordinada:

    gcloud privateca pools create SUBORDINATE_POOL_ID --location=LOCATION
    

    Substitua o seguinte:

    • SUBORDINATE_POOL_ID: o nome do grupo de ACs.
    • LOCATION: a localização onde quer criar o conjunto de ACs. Para ver a lista completa de localizações, consulte Localizações.

    Para mais informações sobre a criação de conjuntos de ACs, consulte o artigo Crie um conjunto de ACs.

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

  2. Crie uma CA subordinada no conjunto de CAs 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 declaração é devolvida quando a CA subordinada é criada.

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

    Para ver uma lista exaustiva de definições, execute o seguinte comando gcloud:

    gcloud privateca subordinates create --help
    

    O comando devolve exemplos para criar uma AC subordinada cujo emissor esteja localizado no serviço de AC ou noutro local.

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 se autenticar no serviço de AC, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure 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 se autenticar no serviço de AC, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure 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}")

Ative uma CA subordinada

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

Consola

  1. Aceda à página Serviço de autoridade de certificação na Google Cloud consola.

    Aceda ao serviço de autoridade de certificação

  2. Clique no separador Gestor de AC.

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

  4. Clique em Ativar.

  5. Na caixa de diálogo apresentada, clique em Transferir CSR para transferir o ficheiro CSR com codificação PEM que a AC emissora pode assinar.

  6. Clicar em Seguinte.

  7. No campo Carregar cadeia de certificados, clique em Procurar.

  8. Carregue o ficheiro 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 \
--location=LOCATION

Substitua o seguinte:

  • SUBORDINATE_CA_ID: o identificador exclusivo da AC subordinada.
  • SUBORDINATE_POOL_ID: o nome do conjunto de ACs que contém a AC subordinada.
  • LOCATION: a localização do grupo de ACs. Para ver a lista completa de localizações, consulte Localizações.

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.

O que se segue?