Crear una autoridad de certificación raíz

En esta página se describe cómo crear una autoridad de certificación (CA) raíz en un grupo de CAs.

Una autoridad de certificación raíz se encuentra en la parte superior de una jerarquía de infraestructura de clave pública (PKI) y es responsable de formar el anclaje de confianza de la PKI. Para participar correctamente y usar certificados en una PKI, un dispositivo, un software o un componente debe confiar en la PKI. Para ello, se configura el dispositivo, el software o el componente para que confíe en la AC raíz. Por lo tanto, todos los certificados emitidos por la AC raíz son de confianza.

Antes de empezar

Crear una CA raíz

Una AC raíz tiene un certificado autofirmado que debes distribuir a los almacenes de confianza de tus clientes. El certificado de la AC raíz se encuentra en la parte superior de la cadena de certificados. Ninguna otra AC puede revocar el certificado de la AC. La CRL de la AC raíz solo se aplica a los demás certificados que ha emitido la AC raíz, pero no a sí misma.

Puedes crear una AC raíz en un grupo de ACs que ya tengas o en uno nuevo. En las siguientes instrucciones se usa un grupo ya creado.

Consola

Para crear una AC raíz en un grupo de ACs, sigue estos pasos:

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

    Ir al Servicio de Autoridades de Certificación

  2. Haga clic en la pestaña Administrador de autoridades de certificación.

  3. Haz clic en la flecha del menú desplegable Crear AC y, a continuación, selecciona Crear AC en un grupo de ACs.

Seleccionar grupo de autoridades de certificación

Selecciona un grupo de CAs de la lista y haz clic en Continuar.

Seleccionar el tipo de autoridad de certificación

  1. En Type (Tipo), selecciona Root CA (Autoridad de certificación raíz).
  2. En el campo Válido durante, introduce la duración durante la que quieres que sean válidos los certificados emitidos por el certificado de AC.
  3. En Estado inicializado, selecciona el estado operativo de la AC que se va a crear.
  4. Haz clic en Continuar.
Configurar el nombre de sujeto de la autoridad de certificación
  1. En el campo Organización (O), introduce el nombre de tu empresa.
  2. Opcional: En el campo Unidad organizativa (UO), introduce el departamento empresarial o la unidad de negocio.
  3. Opcional: En el campo Nombre del país (C), introduce el código de dos letras del país.
  4. Opcional: En el campo Nombre del estado o de la provincia, introduce el nombre de tu estado.
  5. Opcional: En el campo Nombre de la localidad, introduce el nombre de tu ciudad.
  6. En el campo Nombre común de la autoridad de certificación (NC), introduce el nombre de la autoridad de certificación.
  7. Haz clic en Continuar.
Configurar el tamaño de clave y el algoritmo de la autoridad de certificación
  1. Elige el algoritmo de claves que mejor se adapte a tus necesidades. Para obtener información sobre cómo elegir el algoritmo de claves adecuado, consulta Elegir un algoritmo de claves.
  2. Haz clic en Continuar.
Configurar artefactos de la AC
  1. Elige si quieres usar un segmento de Cloud Storage gestionado por Google o por el cliente.
    1. En el caso de un segmento de Cloud Storage gestionado por Google, CA Service crea un segmento gestionado por Google en la misma ubicación que la CA.
    2. En el caso de un segmento de Cloud Storage gestionado por el cliente, haga clic en Examinar y seleccione uno de los segmentos de Cloud Storage.
  2. Haz clic en Continuar.
Añadir etiquetas

Los siguientes pasos son opcionales.

Si quieres añadir etiquetas a la AC, haz lo siguiente:

  1. Haz clic en Añadir elemento.
  2. En el campo Clave 1, introduce la clave de la etiqueta.
  3. En el campo Valor 1, introduce el valor de la etiqueta.
  4. Si quiere añadir otra etiqueta, haga clic en Añadir elemento. A continuación, añade la clave y el valor de la etiqueta, tal como se indica en los pasos 2 y 3.
  5. Haz clic en Continuar.
Revisa los ajustes

Revisa detenidamente todos los ajustes y haz clic en Hecho para crear la AC.

gcloud

  1. Para crear una CA raíz en un grupo de CAs, ejecuta el siguiente comando:

    gcloud privateca roots create ROOT_CA_ID \
        --location=LOCATION \
        --pool=POOL_ID \
        --key-algorithm=KEY_ALGORITHM \
        --subject="CN=my-ca, O=Test LLC"
    

    Haz los cambios siguientes:

    • ROOT_CA_ID: el nombre de la autoridad de certificación.
    • LOCATION: la ubicación del grupo de autoridades de certificación.
    • POOL_ID: el nombre del grupo de autoridades de certificación.
    • KEY_ALGORITHM: algoritmo que se usará para crear una clave de Cloud KMS. Esta marca es opcional. Si no incluyes esta marca, el algoritmo de claves será rsa-pkcs1-4096-sha256 de forma predeterminada. Para obtener más información, consulta la marca --key-algorithm.

    De forma predeterminada, la AC se crea en el estado STAGED. Para habilitar una CA de forma predeterminada, incluye la marca --auto-enable.

    Si quieres usar un segmento de Cloud Storage gestionado por el cliente para publicar certificados de AC y CRLs, añade --bucket bucket-name al comando. Sustituye bucket-name por el nombre del segmento de Cloud Storage.

    Para ver la lista completa de ajustes, ejecuta el siguiente comando:

    gcloud privateca roots create --help
    

Terraform

Para crear una AC raíz con una clave de cifrado y propiedad de Google con tecnología de Google Cloud, usa la siguiente configuración de ejemplo:

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"
}

Para crear una CA raíz con una clave autogestionada, usa la siguiente configuración de ejemplo:

resource "google_project_service_identity" "privateca_sa" {
  provider = google-beta
  service  = "privateca.googleapis.com"
}

resource "google_kms_crypto_key_iam_binding" "privateca_sa_keyuser_signerverifier" {
  crypto_key_id = "projects/keys-project/locations/us-central1/keyRings/key-ring/cryptoKeys/crypto-key"
  role          = "roles/cloudkms.signerVerifier"

  members = [
    "serviceAccount:${google_project_service_identity.privateca_sa.email}",
  ]
}

resource "google_kms_crypto_key_iam_binding" "privateca_sa_keyuser_viewer" {
  crypto_key_id = "projects/keys-project/locations/us-central1/keyRings/key-ring/cryptoKeys/crypto-key"
  role          = "roles/viewer"
  members = [
    "serviceAccount:${google_project_service_identity.privateca_sa.email}",
  ]
}

resource "google_privateca_certificate_authority" "default" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                     = "ca-pool"
  certificate_authority_id = "my-certificate-authority"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  key_spec {
    cloud_kms_key_version = "projects/keys-project/locations/us-central1/keyRings/key-ring/cryptoKeys/crypto-key/cryptoKeyVersions/1"
  }

  config {
    subject_config {
      subject {
        organization = "Example, Org."
        common_name  = "Example Authority"
      }
    }
    x509_config {
      ca_options {
        # is_ca *MUST* be true for certificate authorities
        is_ca                  = true
        max_issuer_path_length = 10
      }
      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
        }
      }
    }
  }

  depends_on = [
    google_kms_crypto_key_iam_binding.privateca_sa_keyuser_signerverifier,
    google_kms_crypto_key_iam_binding.privateca_sa_keyuser_viewer,
  ]
}

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 Certificate Authority which is the root CA in the given CA Pool. This CA will be
// responsible for signing certificates within this pool.
func createCa(
	w io.Writer,
	projectId string,
	location string,
	caPoolId string,
	caId string,
	caCommonName string,
	org string,
	caDuration int64) 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 under which the CA should be created.
	// caId := "ca-id"					// A unique id/name for the ca.
	// caCommonName := "ca-name"		// A common name for your certificate authority.
	// org := "ca-org"					// The name of your company for your certificate authority.
	// ca_duration := int64(31536000)	// The validity of the certificate authority in seconds.

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

	// Set the types of Algorithm used to create a cloud KMS key.
	keySpec := &privatecapb.CertificateAuthority_KeyVersionSpec{
		KeyVersion: &privatecapb.CertificateAuthority_KeyVersionSpec_Algorithm{
			Algorithm: privatecapb.CertificateAuthority_RSA_PKCS1_2048_SHA256,
		},
	}

	// Set CA subject config.
	subjectConfig := &privatecapb.CertificateConfig_SubjectConfig{
		Subject: &privatecapb.Subject{
			CommonName:   caCommonName,
			Organization: org,
		},
	}

	// Set the key usage options for X.509 fields.
	isCa := true
	x509Parameters := &privatecapb.X509Parameters{
		KeyUsage: &privatecapb.KeyUsage{
			BaseKeyUsage: &privatecapb.KeyUsage_KeyUsageOptions{
				CrlSign:  true,
				CertSign: true,
			},
		},
		CaOptions: &privatecapb.X509Parameters_CaOptions{
			IsCa: &isCa,
		},
	}

	// Set certificate authority settings.
	// Type: SELF_SIGNED denotes that this CA is a root CA.
	ca := &privatecapb.CertificateAuthority{
		Type:    privatecapb.CertificateAuthority_SELF_SIGNED,
		KeySpec: keySpec,
		Config: &privatecapb.CertificateConfig{
			SubjectConfig: subjectConfig,
			X509Config:    x509Parameters,
		},
		Lifetime: &durationpb.Duration{
			Seconds: caDuration,
		},
	}

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

	// Create the CreateCertificateAuthorityRequest.
	// See https://pkg.go.dev/cloud.google.com/go/security/privateca/apiv1/privatecapb#CreateCertificateAuthorityRequest.
	req := &privatecapb.CreateCertificateAuthorityRequest{
		Parent:                 fullCaPoolName,
		CertificateAuthorityId: caId,
		CertificateAuthority:   ca,
	}

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

	if _, err = op.Wait(ctx); err != nil {
		return fmt.Errorf("CreateCertificateAuthority failed during wait: %w", err)
	}

	fmt.Fprintf(w, "CA %s created", caId)

	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.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.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 CreateCertificateAuthority {

  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.
    // certificateAuthorityName: Unique name for the CA.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    String certificateAuthorityName = "certificate-authority-name";
    createCertificateAuthority(project, location, poolId, certificateAuthorityName);
  }

  // Create Certificate Authority which is the root CA in the given CA Pool.
  public static void createCertificateAuthority(
      String project, String location, String poolId, String certificateAuthorityName)
      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()) {

      String commonName = "common-name";
      String orgName = "org-name";
      int caDuration = 100000; // Validity of this CA in seconds.

      // Set the type of Algorithm.
      KeyVersionSpec keyVersionSpec =