Membuat root certificate authority

Halaman ini menjelaskan cara membuat root certificate authority (CA) di kumpulan CA.

CA root berada di bagian atas hierarki infrastruktur kunci publik (PKI) dan bertanggung jawab untuk membentuk anchor kepercayaan PKI. Agar dapat berpartisipasi dan menggunakan sertifikat dengan benar di PKI, perangkat, software, atau komponen harus memercayai PKI. Hal ini dilakukan dengan mengonfigurasi perangkat, software, atau komponen untuk memercayai root CA. Akibatnya, semua sertifikat yang dikeluarkan oleh root CA tepercaya.

Sebelum memulai

Membuat CA root

Root CA memiliki sertifikat yang ditandatangani sendiri yang harus Anda distribusikan ke penyimpanan kepercayaan klien. Sertifikat root CA berada di bagian atas rantai sertifikat. Tidak ada CA lain yang dapat mencabut sertifikat CA. CRL root CA hanya berlaku untuk sertifikat lain yang dikeluarkan oleh root CA, tetapi tidak untuk sertifikat itu sendiri.

Konsol

Untuk membuat CA root, lakukan hal berikut.

  1. Buka halaman Certificate Authority Service di konsol Google Cloud.

    Buka Certificate Authority Service

  2. Klik tab Pengelola CA.

  3. Klik Create CA.

Pilih jenis CA

Untuk mengonfigurasi setelan permanen CA, seperti tingkat, lokasi, masa aktif, dan status operasional saat pembuatan, lakukan hal berikut:

  1. Pilih Root CA.
  2. Di kolom Valid for, masukkan durasi yang Anda inginkan untuk sertifikat yang diterbitkan oleh sertifikat CA agar valid.
  3. Opsional: pilih tingkat untuk CA.
  4. Klik Region dan dalam daftar, pilih lokasi tempat Anda ingin membuat CA. Sebaiknya buat CA secara geografis dekat dengan klien aplikasi Anda. Untuk mengetahui informasi selengkapnya, lihat Memilih lokasi terbaik.
  5. Opsional: Pilih status operasional CA yang akan dibuat.

    Pilih status operasi CA yang akan dibuat.

  6. Opsional: Klik Profil sertifikat. Dalam daftar, pilih profil sertifikat yang cocok dengan jenis sertifikat yang ingin ditetapkan oleh CA.

  7. Klik Berikutnya.

Mengonfigurasi nama subjek CA
  1. Di kolom Organization (O), masukkan nama perusahaan Anda.
  2. Opsional: Di kolom Unit organisasi (OU), masukkan subdivisi atau unit bisnis perusahaan.
  3. Opsional: Di kolom Country name, masukkan kode negara yang terdiri atas dua huruf.
  4. Opsional: Di kolom Nama negara bagian atau provinsi, masukkan nama negara bagian Anda.
  5. Opsional: Di kolom Locality name, masukkan nama kota Anda.
  6. Di kolom CA common name (CN), masukkan nama CA.
  7. Di kolom Pool ID, masukkan nama kumpulan CA. Anda tidak dapat mengubah kumpulan CA setelah membuat CA.
  8. Klik Berikutnya.
Mengonfigurasi ukuran kunci dan algoritma CA
  1. Pilih algoritma kunci yang paling sesuai dengan kebutuhan Anda. Untuk mengetahui informasi tentang cara menentukan algoritma kunci yang sesuai, lihat Memilih algoritma kunci.
  2. Klik Berikutnya.
Mengonfigurasi artefak CA

Langkah-langkah berikut bersifat opsional. Jika Anda melewati langkah-langkah ini, setelan default akan diterapkan.

  1. Pilih apakah Anda ingin menggunakan bucket Cloud Storage yang dikelola Google atau dikelola sendiri.
  2. Jika Anda tidak memilih bucket Cloud Storage yang dikelola sendiri, Layanan CA akan membuat bucket yang dikelola Google di lokasi yang sama dengan CA.

  3. Pilih apakah Anda ingin menonaktifkan publikasi daftar pencabutan sertifikat (CRL) dan sertifikat CA ke bucket Cloud Storage.
  4. Publikasi CRL dan sertifikat CA di bucket Cloud Storage diaktifkan secara default. Untuk menonaktifkan setelan ini, klik tombol.

  5. Klik Berikutnya.
Menambahkan label

Langkah-langkah berikut bersifat opsional.

Jika Anda ingin menambahkan label ke CA, lakukan hal berikut:

  1. Klik Tambahkan item.
  2. Di kolom Key 1, masukkan kunci label.
  3. Di kolom Value 1, masukkan nilai label.
  4. Jika Anda ingin menambahkan label lain, klik Tambahkan item. Kemudian, tambahkan kunci dan nilai label seperti yang disebutkan pada langkah 2 dan 3.
  5. Klik Berikutnya.
Tinjau setelan

Tinjau semua setelan dengan cermat, lalu klik Create untuk membuat CA.

gcloud

  1. Untuk membuat kumpulan CA, jalankan perintah berikut:

    gcloud privateca pools create POOL_ID
    

    Ganti POOL_ID dengan nama kumpulan CA.

    Untuk mengetahui informasi selengkapnya, lihat Membuat kumpulan CA.

    Untuk mengetahui informasi selengkapnya tentang perintah gcloud ini, lihat gcloud privateca pools create.

  2. Buat CA root baru di kumpulan CA yang Anda buat.

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

    Ganti kode berikut:

    • ROOT_CA_ID: Nama CA.
    • POOL_ID: Nama kumpulan CA.
    • KEY_ALGORITHM: Algoritma yang akan digunakan untuk membuat kunci Cloud KMS. Flag ini bersifat opsional. Jika Anda tidak menyertakan flag ini, algoritma kunci akan ditetapkan secara default ke rsa-pkcs1-4096-sha256. Untuk mengetahui informasi selengkapnya, lihat flag --key-algorithm.

    Secara default, CA dibuat dalam status STAGED. Untuk mengaktifkan CA secara default, sertakan flag --auto-enable.

    Jika Anda ingin menggunakan bucket Cloud Storage yang dikelola pelanggan untuk memublikasikan sertifikat CA dan CRL, tambahkan --bucket bucket-name ke perintah. Ganti bucket-name dengan nama bucket Cloud Storage.

    Untuk melihat daftar setelan yang lengkap, jalankan perintah berikut:

    gcloud privateca roots create --help
    

Terraform

Untuk membuat CA root menggunakan kunci milik dan dikelola Google, gunakan contoh konfigurasi berikut:

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

Untuk membuat CA root menggunakan kunci yang dikelola sendiri, gunakan contoh konfigurasi berikut:

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

Untuk melakukan autentikasi ke Layanan CA, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Untuk melakukan autentikasi ke Layanan CA, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


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 =
          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())
              .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 certificateAuthority =
          CertificateAuthority.newBuilder()
              // CertificateAuthority.Type.SELF_SIGNED denotes that this CA is a root CA.
              .setType(CertificateAuthority.Type.SELF_SIGNED)
              .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 certificateAuthorityRequest =
          CreateCertificateAuthorityRequest.newBuilder()
              .setParent(CaPoolName.of(project, location, poolId).toString())
              .setCertificateAuthorityId(certificateAuthorityName)
              .setCertificateAuthority(certificateAuthority)
              .build();

      // Create Certificate Authority.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient
              .createCertificateAuthorityCallable()
              .futureCall(certificateAuthorityRequest);
      Operation response = futureCall.get();

      if (response.hasError()) {
        System.out.println("Error while creating CA !" + response.getError());
        return;
      }

      System.out.println(
          "Certificate Authority created successfully : " + certificateAuthorityName);
    }
  }
}

Python

Untuk melakukan autentikasi ke Layanan CA, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import google.cloud.security.privateca_v1 as privateca_v1
from google.protobuf import duration_pb2


def create_certificate_authority(
    project_id: str,
    location: str,
    ca_pool_name: str,
    ca_name: str,
    common_name: str,
    organization: str,
    ca_duration: int,
) -> None:
    """
    Create Certificate Authority which is the root CA in the given CA Pool. This CA will be
    responsible for signing certificates within this 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.
        ca_name: unique name for the CA.
        common_name: a title for your certificate authority.
        organization: the name of your company for your certificate authority.
        ca_duration: the validity of the certificate authority in seconds.
    """

    caServiceClient = privateca_v1.CertificateAuthorityServiceClient()

    # Set the types of Algorithm used to create a cloud KMS key.
    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 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(
        # CertificateAuthority.Type.SELF_SIGNED denotes that this CA is a root CA.
        type_=privateca_v1.CertificateAuthority.Type.SELF_SIGNED,
        key_spec=key_version_spec,
        config=privateca_v1.CertificateConfig(
            subject_config=subject_config,
            x509_config=x509_parameters,
        ),
        lifetime=duration_pb2.Duration(seconds=ca_duration),
    )

    ca_pool_path = caServiceClient.ca_pool_path(project_id, location, ca_pool_name)

    # Create the CertificateAuthorityRequest.
    request = privateca_v1.CreateCertificateAuthorityRequest(
        parent=ca_pool_path,
        certificate_authority_id=ca_name,
        certificate_authority=certificate_authority,
    )

    operation = caServiceClient.create_certificate_authority(request=request)
    result = operation.result()

    print("Operation result:", result)

REST API

  1. Buat root CA.

    Metode HTTP dan URL:

    POST https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/caPools/POOL_ID/certificateAuthorities?certificate_authority_id=ROOT_CA_ID

    Meminta isi JSON:

    {
    "type": "SELF_SIGNED",
    "lifetime": {
     "seconds": 315576000,
     "nanos": 0
    },
    "config": {
     "subject_config": {
       "subject": {
         "organization": "ORGANIZATION_NAME",
         "common_name": "COMMON_NAME"
       }
     },
     "x509_config":{
       "ca_options":{
         "is_ca":true
       },
       "key_usage":{
         "base_key_usage":{
           "cert_sign":true,
           "crl_sign":true
         }
       }
     }
    },
    "key_spec":{
     "algorithm":"RSA_PKCS1_4096_SHA256"
    }
    }
    

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

    {
     "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
     "metadata": {...},
     "done": false
    }
    

  2. Lakukan polling pada operasi hingga selesai.

    Metode HTTP dan URL:

    GET https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID

    Untuk mengirim permintaan, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

    {
     "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
     "metadata": {...},
     "done": true,
     "response": {
       "@type": "type.googleapis.com/google.cloud.security.privateca.v1.CertificateAuthority",
       "name": "...",
     }
    }
    

Setelah memverifikasi bahwa CA berfungsi seperti yang diharapkan, Anda dapat mengaktifkannya untuk mulai menerbitkan sertifikat load-balanced untuk kumpulan CA.

Mengaktifkan CA root

gcloud

Untuk mengaktifkan CA root, jalankan perintah gcloud berikut:

gcloud privateca roots enable ROOT_CA_ID --pool=POOL_ID

Ganti kode berikut:

  • ROOT_CA_ID: Nama CA.
  • POOL_ID: Nama kumpulan CA.

Terraform

Jika Anda menggunakan Terraform untuk membuat root CA, root CA akan diaktifkan saat pembuatan. Untuk membuat root CA dalam status STAGED, tetapkan kolom desired_state ke STAGED saat membuat CA.

Anda dapat menetapkan kolom desired_state ke ENABLED atau DISABLED setelah pembuatan CA.

Go

Untuk melakukan autentikasi ke Layanan CA, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import (
	"context"
	"fmt"
	"io"

	privateca "cloud.google.com/go/security/privateca/apiv1"
	"cloud.google.com/go/security/privateca/apiv1/privatecapb"
)

// Enable the Certificate Authority present in the given ca pool.
// CA cannot be enabled if it has been already deleted.
func enableCa(w io.Writer, projectId string, location string, caPoolId string, caId string) 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 id of the CA pool under which the CA is present.
	// caId := "ca-id"				// The id of the CA to be enabled.

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

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

	// Create the EnableCertificateAuthorityRequest.
	// See https://pkg.go.dev/cloud.google.com/go/security/privateca/apiv1/privatecapb#EnableCertificateAuthorityRequest.
	req := &privatecapb.EnableCertificateAuthorityRequest{Name: fullCaName}

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

	var caResp *privatecapb.CertificateAuthority
	if caResp, err = op.Wait(ctx); err != nil {
		return fmt.Errorf("EnableCertificateAuthority failed during wait: %w", err)
	}

	if caResp.State != privatecapb.CertificateAuthority_ENABLED {
		return fmt.Errorf("unable to enable Certificate Authority. Current state: %s", caResp.State.String())
	}

	fmt.Fprintf(w, "Successfully enabled Certificate Authority: %s.", caId)
	return nil
}

Java

Untuk melakukan autentikasi ke Layanan CA, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


import com.google.api.core.ApiFuture;
import com.google.cloud.security.privateca.v1.CertificateAuthority.State;
import com.google.cloud.security.privateca.v1.CertificateAuthorityName;
import com.google.cloud.security.privateca.v1.CertificateAuthorityServiceClient;
import com.google.cloud.security.privateca.v1.EnableCertificateAuthorityRequest;
import com.google.longrunning.Operation;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class EnableCertificateAuthority {

  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: The id of the CA pool under which the CA is present.
    // certificateAuthorityName: The name of the CA to be enabled.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    String certificateAuthorityName = "certificate-authority-name";
    enableCertificateAuthority(project, location, poolId, certificateAuthorityName);
  }

  // Enable the Certificate Authority present in the given ca pool.
  // CA cannot be enabled if it has been already deleted.
  public static void enableCertificateAuthority(
      String project, String location, String poolId, String certificateAuthorityName)
      throws IOException, ExecutionException, InterruptedException {
    try (CertificateAuthorityServiceClient certificateAuthorityServiceClient =
        CertificateAuthorityServiceClient.create()) {
      // Create the Certificate Authority Name.
      CertificateAuthorityName certificateAuthorityParent =
          CertificateAuthorityName.newBuilder()
              .setProject(project)
              .setLocation(location)
              .setCaPool(poolId)
              .setCertificateAuthority(certificateAuthorityName)
              .build();

      // Create the Enable Certificate Authority Request.
      EnableCertificateAuthorityRequest enableCertificateAuthorityRequest =
          EnableCertificateAuthorityRequest.newBuilder()
              .setName(certificateAuthorityParent.toString())
              .build();

      // Enable the Certificate Authority.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient
              .enableCertificateAuthorityCallable()
              .futureCall(enableCertificateAuthorityRequest);
      Operation response = futureCall.get();

      if (response.hasError()) {
        System.out.println("Error while enabling Certificate Authority !" + response.getError());
        return;
      }

      // Get the current CA state.
      State caState =
          certificateAuthorityServiceClient
              .getCertificateAuthority(certificateAuthorityParent)
              .getState();

      // Check if the CA is enabled.
      if (caState == State.ENABLED) {
        System.out.println("Enabled Certificate Authority : " + certificateAuthorityName);
      } else {
        System.out.println(
            "Cannot enable the Certificate Authority ! Current CA State: " + caState);
      }
    }
  }
}

Python

Untuk melakukan autentikasi ke Layanan CA, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import google.cloud.security.privateca_v1 as privateca_v1


def enable_certificate_authority(
    project_id: str, location: str, ca_pool_name: str, ca_name: str
) -> None:
    """
    Enable the Certificate Authority present in the given ca pool.
    CA cannot be enabled if it has been already deleted.

    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: the name of the CA pool under which the CA is present.
        ca_name: the name of the CA to be enabled.
    """

    caServiceClient = privateca_v1.CertificateAuthorityServiceClient()
    ca_path = caServiceClient.certificate_authority_path(
        project_id, location, ca_pool_name, ca_name
    )

    # Create the Enable Certificate Authority Request.
    request = privateca_v1.EnableCertificateAuthorityRequest(
        name=ca_path,
    )

    # Enable the Certificate Authority.
    operation = caServiceClient.enable_certificate_authority(request=request)
    operation.result()

    # Get the current CA state.
    ca_state = caServiceClient.get_certificate_authority(name=ca_path).state

    # Check if the CA is enabled.
    if ca_state == privateca_v1.CertificateAuthority.State.ENABLED:
        print("Enabled Certificate Authority:", ca_name)
    else:
        print("Cannot enable the Certificate Authority ! Current CA State:", ca_state)

REST API

  1. Mengaktifkan CA untuk menerbitkan sertifikat dari kumpulan CA.

    Metode HTTP dan URL:

    POST https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/caPools/POOL_ID/certificateAuthorities/ROOT_CA_ID:enable

    Untuk mengirim permintaan, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

    {
     "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
     "metadata": {...},
     "done": false
    }
    

  2. Lakukan polling pada operasi hingga selesai.

    Metode HTTP dan URL:

    GET https://privateca.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID

    Untuk mengirim permintaan, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

    {
     "name": "projects/PROJECT_ID/locations/LOCATION/operations/operation-UUID",
     "metadata": {...},
     "done": true,
     "response": {
       "@type": "type.googleapis.com/google.cloud.security.privateca.v1.CertificateAuthority",
       "name": "...",
     }
    }
    

Menguji CA

Untuk memverifikasi bahwa CA dapat menerbitkan sertifikat, minta sertifikat dari kumpulan CA terkait dan sebutkan secara eksplisit nama CA yang ingin Anda uji menggunakan flag --ca.

Anda dapat menggunakan metode berikut untuk meminta sertifikat dari kumpulan CA:

  1. Minta Layanan CA membuat kunci pribadi atau publik untuk Anda.
  2. Buat kunci pribadi atau publik Anda sendiri dan kirimkan Permintaan Penandatanganan Sertifikat (CSR).

Lebih mudah menggunakan kunci pribadi atau kunci publik yang dibuat secara otomatis untuk meminta sertifikat dari CA dalam kumpulan CA. Bagian ini memberikan informasi tentang pengujian CA menggunakan metode tersebut.

Untuk menggunakan kunci pribadi atau kunci publik yang dibuat secara otomatis untuk meminta sertifikat dari CA di kumpulan CA, jalankan perintah gcloud berikut:

gcloud privateca certificates create \
  --issuer-pool=POOL_ID \
  --ca=ROOT_CA_ID \
  --generate-key \
  --key-output-file=KEY_FILENAME \
  --cert-output-file=CERT_FILENAME \
  --dns-san=DNS_NAME

Ganti kode berikut:

  • POOL_ID: Nama kumpulan CA.
  • ROOT_CA_ID: ID unik CA yang ingin Anda uji.
  • KEY_FILENAME: File tempat kunci yang dihasilkan ditulis dalam format PEM.
  • CERT_FILENAME: File tempat file rantai sertifikat berenkode PEM yang dihasilkan ditulis. Urutan rantai sertifikat adalah dari leaf ke root.
  • DNS_NAME: Satu atau beberapa Nama Alternatif Subjek (SAN) DNS yang dipisahkan koma.

    Flag --generate-key menghasilkan kunci pribadi RSA-2048 baru di komputer Anda.

Untuk menggunakan Permintaan Penandatanganan Sertifikat (CSR) guna meminta sertifikat dari CA dalam kumpulan CA, atau untuk mengetahui informasi selengkapnya tentang cara meminta sertifikat, lihat Meminta sertifikat dan melihat sertifikat yang diterbitkan.

Meng-clone certificate authority

Untuk meng-clone CA yang ada guna memperpanjang CA tersebut, atau membuat CA baru dengan konfigurasi yang sama, jalankan perintah berikut:

gcloud privateca roots create NEW_CA_ID --pool=POOL_ID \
  --from-ca=EXISTING_CA_ID \
  --key-algorithm "ec-p384-sha384"

Ganti kode berikut:

  • NEW_CA_ID: ID unik CA baru.
  • POOL_ID: Nama kumpulan CA tempat Anda ingin membuat CA baru.

Flag --from-ca didukung untuk pembuatan CA root dan subordinat. CA yang ada harus berada dalam kumpulan CA yang sama dengan CA baru.

Flag --key-algorithm menyalin semua konfigurasi CA dari CA yang ada (kecuali untuk versi kunci Cloud KMS dan bucket Cloud Storage). Namun, Anda masih dapat mengganti nilai konfigurasi apa pun di CA baru dengan memberikan tanda yang sesuai secara eksplisit. Misalnya, Anda masih dapat menentukan `--subject SUBJECT untuk menggunakan subjek baru.

Jika Anda menghapus flag --key-algorithm, algoritma akan ditetapkan secara default ke:

  • rsa-pkcs1-4096-sha256 untuk root CA.
  • rsa-pkcs1-2048-sha256 untuk CA subordinat.

Untuk mengetahui informasi selengkapnya tentang perintah gcloud ini, lihat gcloud privateca roots create.

Langkah selanjutnya