Peça um certificado

Esta página descreve como pode criar um pedido de certificado no serviço de autoridade de certificação.

Pode pedir um certificado através dos seguintes métodos:

  1. Gere a sua própria chave privada ou pública e envie um pedido de assinatura de certificado (CSR).
  2. Use uma chave privada ou pública gerada automaticamente pelo serviço de AC.
  3. Use uma chave existente do Cloud Key Management Service (Cloud KMS).

Antes de começar

  1. Prepare o seu ambiente para o CA Service.

  2. Para receber as autorizações de que precisa para emitir certificados, peça ao seu administrador para lhe conceder a função de IAM CA Service Certificate Requester (roles/privateca.certificateRequester) ou CA Service Certificate Manager (roles/privateca.certificateManager).

    Para mais informações sobre as funções de IAM predefinidas para o serviço de AC, consulte o artigo Controlo de acesso com a IAM.

    Para ver informações sobre como conceder uma função de IAM a um principal, consulte o artigo Conceda uma única função.

Peça um certificado através de um CSR

Para obter um certificado, gera um CSR, que usa para pedir o certificado.

Gere o CSR

Para ver instruções detalhadas sobre como gerar um CSR através do OpenSSL, consulte o artigo Como gerar um CSR com o OpenSSL. Também pode usar o seguinte ficheiro de configuração de exemplo como referência quando gerar o seu CSR.

Para usar o ficheiro de configuração de exemplo, siga estes passos:

  1. Crie um ficheiro de configuração denominado csr.cnf com a seguinte configuração.

    cat << EOF > csr.cnf
    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
    prompt = no
    
    [req_distinguished_name]
    CN = example.com
    
    [v3_req]
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = example.com
    DNS.2 = www.example.com
    EOF
    

    Este exemplo gera uma chave RSA de 2048 bits (encriptada com frase secreta) e um CSR correspondente com o seguinte:

    • o atributo commonName no DN do assunto
    • a extensão subjectAlternativeName
    • A extensão keyUsage (marcada como crítica)
    • a extensão extendedKeyUsage

    Modifique os parâmetros conforme necessário. Para usar o formato de ficheiro de configuração x509v3_config para definir extensões para certificados X.509 e CSRs, consulte a documentação do OpenSSL.

  2. Execute o seguinte comando openssl para gerar um CSR e uma chave privada correspondente:

    openssl req -newkey rsa:2048 -out csr.pem -keyout key.pem -config csr.cnf
    

    Este comando gera os seguintes ficheiros:

    • csr.pem: o seu CSR, pronto para ser enviado a uma CA
    • key.pem: a sua chave privada, que deve manter em segurança

    Use o ficheiro csr.pem no seu pedido de certificado.

Envie o pedido de certificado através do CSR

Para pedir um certificado através do CSR, siga estes passos:

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 em Pedir um certificado.

  3. Selecione uma região. A região tem de ser a mesma que a região do conjunto de ACs que pretende usar.

  4. Selecione um grupo de CA.

  5. Opcional: selecione uma CA específica no grupo de CAs. Tenha em atenção que, quando escolhe uma AC específica para a emissão de certificados, cria uma dependência dessa AC, o que dificulta a rotação das ACs.

  6. Opcional: escolha um modelo de certificado. Se usar um modelo de certificado, certifique-se de que as políticas do modelo de certificado não entram em conflito com as políticas do conjunto de AC selecionado.

  7. Clique em Fornecer pedido de assinatura de certificado (CSR) e, de seguida, clique em Seguinte. São apresentados os detalhes do certificado.

  8. Opcional: para substituir o nome do certificado gerado automaticamente, introduza o nome personalizado no campo Nome do certificado. Depois de criar o certificado, não pode eliminar nem reutilizar o nome do certificado.

  9. Opcional: para escolher um período de validade personalizado para o certificado, introduza o valor no campo Válido durante.

  10. Copie e cole o CSR na caixa CSR do certificado. Se quiser carregar um ficheiro que contenha o CSR, clique em Procurar e, de seguida, escolha o ficheiro.

  11. Clique em Gerar certificado.

Transfira o certificado assinado

  1. Para ver o certificado gerado, clique em Ver certificado e, de seguida, clique em Ver.
  2. Para copiar o certificado, clique em . Para transferir o certificado no formato de um ficheiro .crt, clique em Transferir certificado.
  3. Opcional: para transferir a cadeia de certificados, clique em Transferir cadeia de certificados.

gcloud

gcloud privateca certificates create CERT_ID \
    --issuer-pool POOL_ID \
    --issuer-location ISSUER_LOCATION \
    --csr CSR_FILENAME \
    --cert-output-file CERT_OUTPUT_FILE \
    --validity "P30D"

Substitua o seguinte:

  • CERT_ID: o identificador exclusivo do certificado.
  • POOL_ID: o nome do grupo de ACs.
  • ISSUER_LOCATION: a localização do certificado.
  • CSR_FILENAME: o ficheiro que armazena o CSR codificado em PEM.
  • CERT_OUTPUT_FILE: o caminho onde o ficheiro da cadeia de certificados codificado em PEM tem de ser escrito. A cadeia de certificados está ordenada da entidade final para a raiz.

A flag --validity define a duração da validade do certificado. É um sinalizador opcional cujo valor predefinido é 30 dias.

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

Terraform

resource "google_privateca_certificate_authority" "test_ca" {
  pool                     = "my-pool"
  certificate_authority_id = "my-certificate-authority"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  config {
    subject_config {
      subject {
        organization = "HashiCorp"
        common_name  = "my-certificate-authority"
      }
      subject_alt_name {
        dns_names = ["hashicorp.com"]
      }
    }
    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 {
          server_auth = false
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
}


resource "google_privateca_certificate" "default" {
  pool                  = "my-pool"
  location              = "us-central1"
  certificate_authority = google_privateca_certificate_authority.test_ca.certificate_authority_id
  lifetime              = "860s"
  name                  = "my-certificate"
  pem_csr               = tls_cert_request.example.cert_request_pem
}

resource "tls_private_key" "example" {
  algorithm = "RSA"
}

resource "tls_cert_request" "example" {
  private_key_pem = tls_private_key.example.private_key_pem

  subject {
    common_name  = "example.com"
    organization = "ACME Examples, Inc"
  }
}

API REST

  1. Gere um pedido de assinatura de certificado (CSR) através do seu método preferencial, como openssl.

    Segue-se um CSR de exemplo codificado para JSON.

    -----BEGIN CERTIFICATE REQUEST-----\nMIIChTCCAW0CAQAwQDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQ8wDQYDVQQK\nDAZKb29uaXgxEzARBgNVBAMMCmpvb25peC5uZXQwggEiMA0GCSqGSIb3DQEBAQUA\nA4IBDwAwggEKAoIBAQCnyy+5vcRQUBPqAse3ojmWjyUvhcJK6eLRXpp0teEUF5kg\nHb2ov8gYXb9sSim5fnvs09dGYDKibSrL4Siy7lA/NzMzWtKwyQQeLIQq/cLUJVcd\ndItJ0VRcqr+UPkTCii2vrdcocNDChHM1J8chDdl6DkpYieSTqZwlPcWlQBGAINmT\nT3Q0ZarIVM5l74j13WPuToGrhbVOIZXWxWqJjlHbBA8B/VKtSRCzM1qG60y8Pu2f\n6c78Dfg8+CGRzGwnz8aFS0Yf9czT9luNHSadS/RHjvE9FPZCsinz+6mJlXRcphi1\nKaHsDbstUAhse1h5E9Biyr9SFYRHxY7qRv9aSJ/dAgMBAAGgADANBgkqhkiG9w0B\nAQsFAAOCAQEAZz+I9ff1Rf3lTewXRUpA7nr5HVO1ojCR93Pf27tI/hvNH7z7GwnS\noScoJlClxeRqABOCnfmVoRChullb/KmER4BZ/lF0GQpEtbqbjgjkEDpVlBKCb0+L\nHE9psplIz6H9nfFS3Ouoiodk902vrMEh0LyDYNQuqFoyCZuuepUlK3NmtmkexlgT\n0pJg/5FV0iaQ+GiFXSZhTC3drfiM/wDnXGiqpbW9WmebSij5O+3BNYXKBUgqmT3r\nbryFydNq4qSOIbnN/MNb4UoKno3ve7mnGk9lIDf9UMPvhl+bT7C3OLQLGadJroME\npYnKLoZUvRwEdtZpbNL9QhCAm2QiJ6w+6g==\n-----END CERTIFICATE REQUEST-----
    
  2. Peça um certificado.

    Método HTTP e URL:

    POST https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/caPools/POOL_ID/certificates?certificate_id=CERTIFICATE_ID

    Corpo JSON do pedido:

    {
        "lifetime": {
        "seconds": 3600,
        "nanos": 0
        },
        "pem_csr": "PEM_CSR"
    }
    

    Para enviar o seu pedido, expanda uma destas opções:

    Deve receber uma resposta JSON semelhante à seguinte:

    {
        "name": "projects/project-id/locations/location/certificateAuthorities/ca-id/certificates/certificate-id",
        "pemCertificate": "-----BEGIN CERTIFICATE-----...",
        "certificateDescription": {...}
    }
    

Peça um certificado com uma chave gerada automaticamente

Consola

Pode usar a Google Cloud consola para gerar certificados TLS de cliente ou servidor.

  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 em Pedir um certificado.

  3. Selecione uma região. A região tem de ser a mesma que a região do conjunto de ACs que pretende usar.

  4. Selecione um grupo de CA.

  5. Clique em Introduzir detalhes manualmente. São apresentados os detalhes do certificado.

  6. Opcional: substitua o Nome do certificado gerado automaticamente por um nome personalizado exclusivo.

  7. Opcional: para escolher um período de validade personalizado para o certificado, introduza o valor no campo Válido durante.

Adicione o nome do domínio

  1. Em Adicionar nome do domínio, introduza um nome do domínio no campo Nome do domínio 1.
  2. Opcional: se quiser adicionar mais do que um nome de domínio, clique em Adicionar item e introduza outro nome de domínio no campo Nome de domínio 2.

Utilização alargada da chave

  1. Opcional: em Utilização alargada da chave, selecione uma das seguintes opções com base no seu exemplo de utilização:

    • TLS do cliente: estes certificados permitem-lhe autenticar a identidade de um requerente.
    • TLS do servidor: estes certificados permitem-lhe autenticar a identidade de um servidor.
  2. Clicar em Seguinte.

Configure o tamanho da chave e o algoritmo

  1. Opcional: em Configurar o tamanho e o algoritmo da chave, selecione o tamanho e o algoritmo da chave de assinatura na lista. Se ignorar este passo, é usada uma chave de 2048 bits RSASSA-PSS com um resumo SHA 256. Para obter informações sobre como selecionar uma chave de assinatura e um algoritmo, consulte o artigo Escolha um algoritmo de chave.
  2. Clique em Gerar certificado.

Transfira o certificado assinado

  1. Para ver o certificado gerado, clique em Ver certificado e, de seguida, clique em Ver.
  2. Opcional: para transferir a cadeia de certificados codificada PEM, clique em Transferir cadeia de certificados.
  3. Opcional: para transferir a chave privada codificada em PEM associada, clique em Transferir chave privada.

gcloud

Para usar a funcionalidade de chave gerada automaticamente, tem de instalar a biblioteca da autoridade criptográfica (PyCA) do Python. Para ver instruções sobre a instalação da biblioteca de criptografia Pyca, consulte o artigo Incluir a biblioteca de criptografia Pyca.

Para criar um certificado, use o seguinte comando gcloud:

gcloud privateca certificates create \
    --issuer-pool POOL_ID \
    --issuer-location ISSUER_LOCATION \
    --generate-key \
    --key-output-file KEY_FILENAME \
    --cert-output-file CERT_OUTPUT_FILE \
    --dns-san "DNS_NAME" \
    --use-preset-profile "CERTIFICATE_PROFILE"

Substitua o seguinte:

  • POOL_ID: o nome do grupo de ACs.
  • ISSUER_LOCATION: a localização do certificado.
  • KEY_FILENAME: o caminho onde o ficheiro de chave privada gerado tem de ser escrito.
  • CERT_OUTPUT_FILE: o caminho onde o ficheiro da cadeia de certificados codificado em PEM tem de ser escrito. A cadeia de certificados está ordenada da entidade final para a raiz.
  • DNS_NAME: um ou mais nomes alternativos do assunto (SANs) do DNS separados por vírgulas.
  • CERTIFICATE_PROFILE: o identificador exclusivo do perfil do certificado. Por exemplo, use leaf_server_tls para o TLS do servidor de entidade final.

O comando gcloud menciona as seguintes flags:

  • --generate-key: gera uma nova chave privada RSA-2048 no seu computador.

Também pode usar qualquer combinação das seguintes flags:

  • --dns-san: permite transmitir um ou mais SANs de DNS separados por vírgulas.
  • --ip-san: permite transmitir um ou mais SANs de IP separados por vírgulas.
  • --uri-san: permite transmitir um ou mais SANs de URI separados por vírgulas.
  • --subject: permite transmitir um nome X.501 do assunto do certificado.

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

Ir

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 (
	"context"
	"fmt"
	"io"

	privateca "cloud.google.com/go/security/privateca/apiv1"
	"cloud.google.com/go/security/privateca/apiv1/privatecapb"
	"google.golang.org/protobuf/types/known/durationpb"
)

// Create a Certificate which is issued by the Certificate Authority present in the CA Pool.
// The key used to sign the certificate is created by the Cloud KMS.
func createCertificate(
	w io.Writer,
	projectId string,
	location string,
	caPoolId string,
	caId string,
	certId string,
	commonName string,
	domainName string,
	certDuration int64,
	publicKeyBytes []byte) error {
	// projectId := "your_project_id"
	// location := "us-central1"		// For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
	// caPoolId := "ca-pool-id"			// The CA Pool id in which the certificate authority exists.
	// caId := "ca-id"					// The name of the certificate authority which issues the certificate.
	// certId := "certificate"			// A unique name for the certificate.
	// commonName := "cert-name"		// A common name for the certificate.
	// domainName := "cert.example.com"	// Fully qualified domain name for the certificate.
	// certDuration := int64(31536000)	// The validity of the certificate in seconds.
	// publicKeyBytes 					// The public key used in signing the certificates.

	ctx := context.Background()
	caClient, err := privateca.NewCertificateAuthorityClient(ctx)
	if err != nil {
		return fmt.Errorf("NewCertificateAuthorityClient creation failed: %w", err)
	}
	defer caClient.Close()

	// Set the Public Key and its format.
	publicKey := &privatecapb.PublicKey{
		Key:    publicKeyBytes,
		Format: privatecapb.PublicKey_PEM,
	}

	// Set Certificate subject config.
	subjectConfig := &privatecapb.CertificateConfig_SubjectConfig{
		Subject: &privatecapb.Subject{
			CommonName: commonName,
		},
		SubjectAltName: &privatecapb.SubjectAltNames{
			DnsNames: []string{domainName},
		},
	}

	// Set the X.509 fields required for the certificate.
	x509Parameters := &privatecapb.X509Parameters{
		KeyUsage: &privatecapb.KeyUsage{
			BaseKeyUsage: &privatecapb.KeyUsage_KeyUsageOptions{
				DigitalSignature: true,
				KeyEncipherment:  true,
			},
			ExtendedKeyUsage: &privatecapb.KeyUsage_ExtendedKeyUsageOptions{
				ServerAuth: true,
				ClientAuth: true,
			},
		},
	}

	// Set certificate settings.
	cert := &privatecapb.Certificate{
		CertificateConfig: &privatecapb.Certificate_Config{
			Config: &privatecapb.CertificateConfig{
				PublicKey:     publicKey,
				SubjectConfig: subjectConfig,
				X509Config:    x509Parameters,
			},
		},
		Lifetime: &durationpb.Duration{
			Seconds: certDuration,
		},
	}

	fullCaPoolName := fmt.Sprintf("projects/%s/locations/%s/caPools/%s", projectId, location, caPoolId)

	// Create the CreateCertificateRequest.
	// See https://pkg.go.dev/cloud.google.com/go/security/privateca/apiv1/privatecapb#CreateCertificateRequest.
	req := &privatecapb.CreateCertificateRequest{
		Parent:                        fullCaPoolName,
		CertificateId:                 certId,
		Certificate:                   cert,
		IssuingCertificateAuthorityId: caId,
	}

	_, err = caClient.CreateCertificate(ctx, req)
	if err != nil {
		return fmt.Errorf("CreateCertificate failed: %w", err)
	}

	fmt.Fprintf(w, "Certificate %s created", certId)

	return nil
}

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.Certificate;
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.CreateCertificateRequest;
import com.google.cloud.security.privateca.v1.KeyUsage;
import com.google.cloud.security.privateca.v1.KeyUsage.ExtendedKeyUsageOptions;
import com.google.cloud.security.privateca.v1.KeyUsage.KeyUsageOptions;
import com.google.cloud.security.privateca.v1.PublicKey;
import com.google.cloud.security.privateca.v1.PublicKey.KeyFormat;
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.protobuf.ByteString;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateCertificate {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException, IOException {
    // TODO(developer): Replace these variables before running the sample.

    // publicKeyBytes: Public key used in signing the certificates.
    // location: For a list of locations, see:
    // https://cloud.google.com/certificate-authority-service/docs/locations
    // poolId: Set a unique id for the CA pool.
    // certificateAuthorityName: The name of the certificate authority which issues the certificate.
    // certificateName: Set a unique name for the certificate.
    String project = "your-project-id";
    ByteString publicKeyBytes = ByteString.copyFrom(new byte[]{});
    String location = "ca-location";
    String poolId = "ca-poolId";
    String certificateAuthorityName = "certificate-authority-name";
    String certificateName = "certificate-name";

    createCertificate(
        project, location, poolId, certificateAuthorityName, certificateName, publicKeyBytes);
  }

  // Create a Certificate which is issued by the Certificate Authority present in the CA Pool.
  // The public key used to sign the certificate can be generated using any crypto
  // library/framework.
  public static void createCertificate(
      String project,
      String location,
      String poolId,
      String certificateAuthorityName,
      String certificateName,
      ByteString publicKeyBytes)
      throws InterruptedException, ExecutionException, IOException {
    // 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()) {

      // commonName: Enter a title for your certificate.
      // orgName: Provide the name of your company.
      // domainName: List the fully qualified domain name.
      // certificateLifetime: The validity of the certificate in seconds.
      String commonName = "commonname";
      String orgName = "orgname";
      String domainName = "dns.example.com";
      long certificateLifetime = 1000L;

      // Set the Public Key and its format.
      PublicKey publicKey =
          PublicKey.newBuilder().setKey(publicKeyBytes).setFormat(KeyFormat.PEM).build();

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

      // Set the X.509 fields required for the certificate.
      X509Parameters x509Parameters =
          X509Parameters.newBuilder()
              .setKeyUsage(
                  KeyUsage.newBuilder()
                      .setBaseKeyUsage(
                          KeyUsageOptions.newBuilder()
                              .setDigitalSignature(true)
                              .setKeyEncipherment(true)
                              .setCertSign(true)
                              .build())
                      .setExtendedKeyUsage(
                          ExtendedKeyUsageOptions.newBuilder().setServerAuth(true).build())
                      .build())
              .setCaOptions(CaOptions.newBuilder().setIsCa(true).buildPartial())
              .build();

      // Create certificate.
      Certificate certificate =
          Certificate.newBuilder()
              .setConfig(
                  CertificateConfig.newBuilder()
                      .setPublicKey(publicKey)
                      .setSubjectConfig(subjectConfig)
                      .setX509Config(x509Parameters)
                      .build())
              .setLifetime(Duration.newBuilder().setSeconds(certificateLifetime).build())
              .build();

      // Create the Certificate Request.
      CreateCertificateRequest certificateRequest =
          CreateCertificateRequest.newBuilder()
              .setParent(CaPoolName.of(project, location, poolId).toString())
              .setCertificateId(certificateName)
              .setCertificate(certificate)
              .setIssuingCertificateAuthorityId(certificateAuthorityName)
              .build();

      // Get the Certificate response.
      ApiFuture<Certificate> future =
          certificateAuthorityServiceClient
              .createCertificateCallable()
              .futureCall(certificateRequest);

      Certificate response = future.get();
      // Get the PEM encoded, signed X.509 certificate.
      System.out.println(response.getPemCertificate());
      // To verify the obtained certificate, use this intermediate chain list.
      System.out.println(response.getPemCertificateChainList());
    }
  }
}

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_certificate(
    project_id: str,
    location: str,
    ca_pool_name: str,
    ca_name: str,
    certificate_name: str,
    common_name: str,
    domain_name: str,
    certificate_lifetime: int,
    public_key_bytes: bytes,
) -> None:
    """
    Create a Certificate which is issued by the Certificate Authority present in the CA Pool.
    The key used to sign the certificate is created by the Cloud KMS.

    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 a unique name for the CA pool.
        ca_name: the name of the certificate authority which issues the certificate.
        certificate_name: set a unique name for the certificate.
        common_name: a title for your certificate.
        domain_name: fully qualified domain name for your certificate.
        certificate_lifetime: the validity of the certificate in seconds.
        public_key_bytes: public key used in signing the certificates.
    """

    caServiceClient = privateca_v1.CertificateAuthorityServiceClient()

    # The public key used to sign the certificate can be generated using any crypto library/framework.
    # Also you can use Cloud KMS to retrieve an already created public key.
    # For more info, see: https://cloud.google.com/kms/docs/retrieve-public-key.

    # Set the Public Key and its format.
    public_key = privateca_v1.PublicKey(
        key=public_key_bytes,
        format_=privateca_v1.PublicKey.KeyFormat.PEM,
    )

    subject_config = privateca_v1.CertificateConfig.SubjectConfig(
        subject=privateca_v1.Subject(common_name=common_name),
        subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain_name]),
    )

    # Set the X.509 fields required for the certificate.
    x509_parameters = privateca_v1.X509Parameters(
        key_usage=privateca_v1.KeyUsage(
            base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                digital_signature=True,
                key_encipherment=True,
            ),
            extended_key_usage=privateca_v1.KeyUsage.ExtendedKeyUsageOptions(
                server_auth=True,
                client_auth=True,
            ),
        ),
    )

    # Create certificate.
    certificate = privateca_v1.Certificate(
        config=privateca_v1.CertificateConfig(
            public_key=public_key,
            subject_config=subject_config,
            x509_config=x509_parameters,
        ),
        lifetime=duration_pb2.Duration(seconds=certificate_lifetime),
    )

    # Create the Certificate Request.
    request = privateca_v1.CreateCertificateRequest(
        parent=caServiceClient.ca_pool_path(project_id, location, ca_pool_name),
        certificate_id=certificate_name,
        certificate=certificate,
        issuing_certificate_authority_id=ca_name,
    )
    result = caServiceClient.create_certificate(request=request)

    print("Certificate creation result:", result)

Peça um certificado com uma chave do Cloud KMS existente

Só pode usar a CLI do Google Cloud para pedir certificados com uma chave do Cloud KMS.

gcloud

Para usar uma chave do Cloud KMS para criar um certificado TLS de servidor de entidade final, execute o seguinte comando:

gcloud privateca certificates create \
    --issuer-pool POOL_ID \
    --issuer-location ISSUER_LOCATION \
    --kms-key-version projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING/cryptoKeys/KEY/cryptoKeyVersions/KEY_VERSION \
    --cert-output-file CERT_OUTPUT_FILE \
    --dns-san "DNS_NAME" \
    --use-preset-profile "leaf_server_tls"

Substitua o seguinte:

  • POOL_ID: o nome do grupo de ACs.
  • ISSUER_LOCATION: a localização do certificado.
  • PROJECT_ID: o ID do projeto.
  • LOCATION_ID: a localização do conjunto de chaves.
  • KEY_RING: o nome do conjunto de chaves onde a chave se encontra.
  • KEY: o nome da chave.
  • KEY_VERSION: a versão da chave.
  • CERT_OUTPUT_FILE: o caminho do ficheiro da cadeia de certificados codificado em PEM. O ficheiro da cadeia de certificados está ordenado da entidade final para a raiz.
  • DNS_NAME: SANs de DNS separados por vírgulas.

Emitir um certificado de uma AC específica num conjunto de ACs

Esta secção descreve como emitir certificados a partir de uma AC específica num conjunto de ACs.

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 em Pedir um certificado.

  3. Selecione uma região. A região tem de ser a mesma que a região do conjunto de ACs que pretende usar.

  4. Selecione um grupo de CAs.

  5. Para escolher uma AC, clique em Usar uma AC específica deste conjunto de ACs e, de seguida, selecione uma AC na lista.

  6. Selecione outros parâmetros, tal como fez na secção Peça um certificado com uma chave gerada automaticamente ou na secção Peça um certificado com um CSR.

gcloud

Para segmentar uma AC específica no conjunto de ACs para a emissão de certificados, adicione a flag --ca com o CA_ID da AC que tem de emitir o certificado.

gcloud privateca certificates create \
    --issuer-pool POOL_ID \
    --issuer-location ISSUER_LOCATION \
    --ca CA_ID \
    --generate-key \
    --key-output-file KEY_FILENAME \
    --cert-output-file CERT_OUTPUT_FILE \
    --dns-san "DNS_NAME" \
    --use-preset-profile "leaf_server_tls"

Terraform

resource "google_privateca_certificate_authority" "authority" {
  // 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-sample-certificate-authority"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  config {
    subject_config {
      subject {
        organization = "HashiCorp"
        common_name  = "my-certificate-authority"
      }
      subject_alt_name {
        dns_names = ["hashicorp.com"]
      }
    }
    x509_config {
      ca_options {
        is_ca = true
      }
      key_usage {
        base_key_usage {
          digital_signature = true
          cert_sign         = true
          crl_sign          = true
        }
        extended_key_usage {
          server_auth = true
        }
      }
    }
  }
  lifetime = "86400s"
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
}


resource "google_privateca_certificate" "default" {
  pool     = "my-pool"
  location = "us-central1"
  lifetime = "860s"
  name     = "my-sample-certificate"
  config {
    subject_config {
      subject {
        common_name         = "san1.example.com"
        country_code        = "us"
        organization        = "google"
        organizational_unit = "enterprise"
        locality            = "mountain view"
        province            = "california"
        street_address      = "1600 amphitheatre parkway"
        postal_code         = "94109"
      }
    }
    x509_config {
      ca_options {
        is_ca = false
      }
      key_usage {
        base_key_usage {
          crl_sign = true
        }
        extended_key_usage {
          server_auth = true
        }
      }
    }
    public_key {
      format = "PEM"
      key    = base64encode(data.tls_public_key.example.public_key_pem)
    }
  }
  // Certificates require an authority to exist in the pool, though they don't
  // need to be explicitly connected to it
  depends_on = [google_privateca_certificate_authority.authority]
}

resource "tls_private_key" "example" {
  algorithm = "RSA"
}

data "tls_public_key" "example" {
  private_key_pem = tls_private_key.example.private_key_pem
}

Peça um certificado no modo de validação

Pedir um certificado no modo de validação cria um certificado de teste não assinado. Este certificado de teste não está codificado em PEM e não incorre em custos. Embora não possa transferir o certificado, a descrição do certificado hipotético permite-lhe confirmar que pode emitir com êxito um certificado assinado com os parâmetros escolhidos.

Para pedir um certificado no modo de validação, siga estes passos:

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 em Pedir um certificado.

  3. Selecione Usar o modo de validação para uma descrição hipotética do certificado em vez de um certificado assinado.

  4. Siga os mesmos passos que seguiria para pedir um certificado assinado.

O que se segue?