Solicitar un certificado

En esta página se describe cómo puedes crear una solicitud de certificado en el Servicio de Autoridades de Certificación.

Puedes solicitar un certificado de las siguientes formas:

  1. Genera tu propia clave privada o pública y envía una solicitud de firma de certificado (CSR).
  2. Usa una clave privada o pública generada automáticamente por el servicio de AC.
  3. Usar una clave de Cloud Key Management Service (Cloud KMS) ya creada.

Antes de empezar

  1. Prepara tu entorno para CA Service.

  2. Para obtener los permisos que necesitas para emitir certificados, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Solicitante del certificado del Servicio de Autoridades de Certificación (roles/privateca.certificateRequester) o Administrador de certificados del Servicio de Autoridades de Certificación (roles/privateca.certificateManager).

    Para obtener más información sobre los roles de gestión de identidades y accesos predefinidos para el servicio de CA, consulta el artículo sobre el control de acceso con gestión de identidades y accesos.

    Para obtener información sobre cómo conceder un rol de IAM a una entidad, consulta el artículo sobre cómo asignar un rol concreto.

Solicitar un certificado mediante una CSR

Para obtener un certificado, genera una CSR, que luego usas para solicitar el certificado.

Generar la CSR

Para obtener instrucciones detalladas sobre cómo generar una CSR con OpenSSL, consulta el artículo Cómo generar una CSR con OpenSSL. También puedes usar el siguiente archivo de configuración de ejemplo como referencia al generar tu CSR.

Para usar el archivo de configuración de ejemplo, sigue estos pasos:

  1. Crea un archivo de configuración llamado csr.cnf con la siguiente configuración.

    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
    

    En este ejemplo se genera una clave RSA de 2048 bits (cifrada con una contraseña) y un CSR correspondiente que contiene lo siguiente:

    • El atributo commonName del DN de la entidad
    • la extensión subjectAlternativeName
    • La extensión keyUsage (marcada como crítica)
    • la extensión extendedKeyUsage

    Modifica los parámetros según sea necesario. Para usar el formato de archivo de configuración x509v3_config para definir extensiones de certificados X.509 y CSRs, consulta la documentación de OpenSSL.

  2. Ejecuta el siguiente comando openssl para generar una CSR y una clave privada correspondiente:

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

    Este comando genera los siguientes archivos:

    • csr.pem: tu CSR, listo para enviarse a una CA
    • key.pem: tu clave privada, que debes mantener protegida

    Usa el archivo csr.pem en tu solicitud de certificado.

Enviar la solicitud de certificado mediante la CSR

Para solicitar un certificado con la CSR, sigue estos pasos:

Consola

  1. Ve a la página Servicio de autoridad de certificación de laGoogle Cloud consola.

    Ir al Servicio de Autoridades de Certificación

  2. Haz clic en Solicitar un certificado.

  3. Selecciona una región. La región debe ser la misma que la del grupo de CAs que quieras usar.

  4. Selecciona un grupo de autoridades de certificación.

  5. Opcional: Selecciona una AC específica del grupo de ACs. Ten en cuenta que, si eliges una AC específica para emitir certificados, crearás una dependencia de esa AC, lo que dificultará la rotación de las ACs.

  6. Opcional: Elige una plantilla de certificado. Si usas una plantilla de certificado, asegúrate de que las políticas de la plantilla no entren en conflicto con las políticas del grupo de CAs seleccionado.

  7. Haz clic en Proporcionar solicitud de firma de certificado (CSR) y, a continuación, en Siguiente. Se muestran los detalles del certificado.

  8. Opcional: Para sobrescribir el nombre del certificado generado automáticamente, introduce el nombre personalizado en el campo Nombre del certificado. Una vez que se haya creado el certificado, no podrás eliminar ni reutilizar su nombre.

  9. Opcional: Para elegir un periodo de validez personalizado para el certificado, introduce el valor en el campo Válido durante.

  10. Copia y pega tu CSR en el cuadro Certificate CSR (CSR del certificado). Si quiere subir un archivo que contenga la CSR, haga clic en Examinar y, a continuación, elija el archivo.

  11. Haz clic en Generar certificado.

Descargar el certificado firmado

  1. Para ver el certificado generado, haz clic en Ver certificado y, a continuación, en Ver.
  2. Para copiar el certificado, haz clic en . Para descargar el certificado en forma de archivo .crt, haz clic en Descargar certificado.
  3. Opcional: Para descargar la cadena de certificados, haz clic en Descargar cadena 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"

Haz los cambios siguientes:

  • CERT_ID: identificador único del certificado.
  • POOL_ID: el nombre del grupo de autoridades de certificación.
  • ISSUER_LOCATION: la ubicación del certificado.
  • CSR_FILENAME: el archivo que almacena la CSR codificada en PEM.
  • CERT_OUTPUT_FILE: la ruta en la que se debe escribir el archivo de cadena de certificados codificado en PEM. La cadena de certificados se ordena de la entidad final a la raíz.

La marca --validity define la duración durante la que el certificado es válido. Es una marca opcional cuyo valor predeterminado es 30 días.

Para obtener más información sobre el comando gcloud privateca certificates create, consulta 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. Genera una solicitud de firma de certificado (CSR) con el método que prefieras, como openssl.

    A continuación, se muestra una CSR de ejemplo codificada en 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. Solicita un certificado.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, despliega una de estas opciones:

    Deberías recibir una respuesta JSON similar a la siguiente:

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

Solicitar un certificado con una clave generada automáticamente

Consola

Puedes usar la Google Cloud consola para generar certificados TLS de cliente o de servidor.

  1. Ve a la página Servicio de autoridad de certificación de laGoogle Cloud consola.

    Ir al Servicio de Autoridades de Certificación

  2. Haz clic en Solicitar un certificado.

  3. Selecciona una región. La región debe ser la misma que la del grupo de CAs que quieras usar.

  4. Selecciona un grupo de autoridades de certificación.

  5. Haz clic en Introducir detalles manualmente. Se muestran los detalles del certificado.

  6. Opcional: Sustituye el Nombre del certificado generado automáticamente por un nombre personalizado que sea único.

  7. Opcional: Para elegir un periodo de validez personalizado para el certificado, introduce el valor en el campo Válido durante.

Añadir nombre de dominio

  1. En Añadir nombre de dominio, introduce un nombre de dominio en el campo Nombre de dominio 1.
  2. Opcional: Si quieres añadir más de un nombre de dominio, haz clic en Añadir elemento e introduce otro nombre de dominio en el campo Nombre de dominio 2.

Uso adicional de claves

  1. Opcional: En Usos adicionales de claves, selecciona una de las siguientes opciones en función de tu caso práctico:

    • TLS de cliente: estos certificados te permiten autenticar la identidad de un solicitante.
    • TLS del servidor: estos certificados te permiten autenticar la identidad de un servidor.
  2. Haz clic en Siguiente.

Configurar el tamaño de clave y el algoritmo

  1. Opcional: En Configurar el algoritmo y el tamaño de clave, seleccione el tamaño y el algoritmo de la clave de firma de la lista. Si te saltas este paso, se usará una clave de 2048 bits RSASSA-PSS con un resumen SHA-256. Para obtener información sobre cómo seleccionar una clave de firma y un algoritmo, consulte Elegir un algoritmo de claves.
  2. Haz clic en Generar certificado.

Descargar el certificado firmado

  1. Para ver el certificado generado, haz clic en Ver certificado y, a continuación, en Ver.
  2. Opcional: Para descargar la cadena de certificados codificada en PEM, haz clic en Descargar cadena de certificados.
  3. Opcional: Para descargar la clave privada codificada en PEM asociada, haz clic en Descargar clave privada.

gcloud

Para usar la función de clave generada automáticamente, debes instalar la biblioteca Python Cryptographic Authority (PyCA). Para obtener instrucciones sobre cómo instalar la biblioteca de criptografía Pyca, consulta el artículo Incluir la biblioteca de criptografía Pyca.

Para crear un certificado, usa el siguiente 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"

Haz los cambios siguientes:

  • POOL_ID: el nombre del grupo de autoridades de certificación.
  • ISSUER_LOCATION: la ubicación del certificado.
  • KEY_FILENAME: la ruta en la que se debe escribir el archivo de clave privada generado.
  • CERT_OUTPUT_FILE: la ruta en la que se debe escribir el archivo de cadena de certificados codificado en PEM. La cadena de certificados está ordenada de la entidad final a la raíz.
  • DNS_NAME: uno o varios nombres alternativos del sujeto (SANs) de DNS separados por comas.
  • CERTIFICATE_PROFILE: el identificador único del perfil de certificado. Por ejemplo, usa leaf_server_tls para TLS de servidor de entidad final.

El comando gcloud menciona las siguientes marcas:

  • --generate-key: genera una nueva clave privada RSA-2048 en tu máquina.

También puedes usar cualquier combinación de las siguientes marcas:

  • --dns-san: te permite transferir uno o varios SANs de DNS separados por comas.
  • --ip-san: permite transferir uno o varios SANs de IP separados por comas.
  • --uri-san: te permite enviar uno o varios SANs de URI separados por comas.
  • --subject: permite transferir un nombre X.501 del asunto del certificado.

Para obtener más información sobre el comando gcloud privateca certificates create, consulta gcloud privateca certificates create.

Go

Para autenticarte en el servicio de AC, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 autenticarte en el servicio de AC, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 autenticarte en el servicio de AC, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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)

Solicitar un certificado con una clave de Cloud KMS

Solo puedes usar la CLI de Google Cloud para solicitar certificados con una clave de Cloud KMS.

gcloud

Para usar una clave de Cloud KMS para crear un certificado TLS de servidor de entidad final, ejecuta el siguiente 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"

Haz los cambios siguientes:

  • POOL_ID: el nombre del grupo de autoridades de certificación.
  • ISSUER_LOCATION: la ubicación del certificado.
  • PROJECT_ID: el ID del proyecto.
  • LOCATION_ID: la ubicación del conjunto de claves.
  • KEY_RING: el nombre del conjunto de claves donde se encuentra la clave.
  • KEY: el nombre de la clave.
  • KEY_VERSION: la versión de la clave.
  • CERT_OUTPUT_FILE: la ruta del archivo de cadena de certificados codificado en PEM. El archivo de cadena de certificados está ordenado de entidad final a raíz.
  • DNS_NAME: nombres alternativos de DNS separados por comas.

Emitir un certificado de una CA específica de un grupo de CAs

En esta sección se describe cómo emitir certificados de una CA específica en un grupo de CAs.

Consola

  1. Ve a la página Servicio de autoridad de certificación de laGoogle Cloud consola.

    Ir al Servicio de Autoridades de Certificación

  2. Haz clic en Solicitar un certificado.

  3. Selecciona una región. La región debe ser la misma que la del grupo de CAs que quieras usar.

  4. Selecciona un grupo de autoridades de certificación.

  5. Para elegir una AC, haz clic en Usar una AC específica de este grupo de ACs y, a continuación, selecciona una AC de la lista.

  6. Selecciona otros parámetros como hiciste en la sección Solicitar certificado con una clave generada automáticamente o en la sección Solicitar certificado con una CSR.

gcloud

Para orientar la emisión de certificados a una AC específica del grupo de ACs, añade la marca --ca con el CA_ID de la AC que debe emitir el 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
}

Solicitar un certificado en modo de validación

Si solicitas un certificado en modo de validación, se crea un certificado de prueba sin firmar. Este certificado de prueba no está codificado en PEM y no conlleva ningún cargo. Aunque no puedes descargar el certificado, la descripción hipotética del certificado te permite confirmar que puedes emitir un certificado firmado correctamente con los parámetros que has elegido.

Para solicitar un certificado en modo de validación, sigue estos pasos:

Consola

  1. Ve a la página Servicio de autoridad de certificación de laGoogle Cloud consola.

    Ir al Servicio de Autoridades de Certificación

  2. Haz clic en Solicitar un certificado.

  3. Selecciona Usar el modo de validación para una descripción hipotética del certificado en lugar de un certificado firmado.

  4. Sigue los mismos pasos que para solicitar un certificado firmado.

Siguientes pasos