Membuat certificate authority subordinat

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

CA subordinat bertanggung jawab untuk menerbitkan sertifikat langsung ke entitas akhir seperti pengguna, komputer, dan perangkat. CA subordinat ditandatangani secara kriptografi oleh CA induk, yang sering kali merupakan CA root. Oleh karena itu, sistem yang mempercayai CA root, secara otomatis mempercayai CA subordinat dan sertifikat entitas akhir yang diterbitkan oleh CA subordinat.

Sebelum memulai

  • Pastikan Anda memiliki peran IAM CA Service Operation Manager (roles/privateca.caManager) atau CA Service Admin (roles/privateca.admin). Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi kebijakan IAM.
  • Buat kumpulan CA.
  • Pilih CA root.

Membuat CA subordinat

CA subordinat lebih mudah dicabut dan dirotasi daripada CA root. Jika Anda memiliki beberapa skenario penerbitan sertifikat, Anda dapat membuat CA subordinat untuk setiap skenario tersebut. Menambahkan beberapa CA subordinat dalam kumpulan CA membantu Anda mencapai penyeimbangan beban permintaan sertifikat yang lebih baik dan QPS efektif total yang lebih tinggi.

Untuk membuat CA subordinat, lakukan hal berikut:

Konsol

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

    Buka Certificate Authority Service

  2. Klik tab CA manager.

  3. Klik Create CA.

    Buat CA menggunakan Konsol Cloud.

Pilih jenis CA

  1. Klik Subordinate CA.
  2. Klik Root CA is in Google Cloud.
  3. Di kolom Valid for, masukkan durasi masa berlaku sertifikat CA.
  4. Opsional: Pilih tingkat untuk CA. Tingkat default-nya adalah Enterprise. Untuk mengetahui informasi selengkapnya, lihat Memilih tingkat operasi.
  5. Klik Region untuk memilih lokasi CA. Untuk mengetahui informasi selengkapnya, lihat Lokasi.
  6. Opsional: Di bagian Initialized state, pilih status operasional untuk membuat CA.
  7. Opsional: Di bagian Set up an issuance scenario, klik Certificate profile, lalu pilih profil sertifikat yang paling sesuai dengan persyaratan Anda dari daftar. Untuk mengetahui informasi selengkapnya, lihat Profil sertifikat.
  8. Klik Next.
Konfigurasi nama subjek CA
  1. Di kolom Organization (O), masukkan nama perusahaan Anda.
  2. Opsional: Di kolom Organization unit (OU), masukkan subdivisi perusahaan atau unit bisnis perusahaan.
  3. Opsional: Di kolom Country name (C), masukkan kode negara dua huruf.
  4. Opsional: Di kolom State or province name, 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. Klik Continue.
Konfigurasi ukuran kunci dan algoritme CA
  1. Pilih algoritme kunci yang paling sesuai dengan kebutuhan Anda. Untuk mengetahui detail selengkapnya tentang opsi kunci penandatanganan, lihat Mengonfigurasi kunci penandatanganan CA.
  2. Untuk menggunakan kunci penandatanganan yang dikelola pelanggan, pilih Customer-managed key , lalu berikan versi kunci kripto Cloud Key Management Service.
  3. Klik Continue.
Konfigurasikan artefak CA
  1. Pilih apakah Anda ingin menggunakan bucket Cloud Storage yang dikelola Google atau yang dikelola pelanggan.
    1. Untuk bucket Cloud Storage yang dikelola Google, CA Service akan membuat bucket yang dikelola Google di lokasi yang sama dengan CA.
    2. Untuk bucket Cloud Storage yang dikelola pelanggan, klik Browse, lalu pilih salah satu bucket Cloud Storage yang ada.
  2. Klik Continue.
Menambahkan label

Langkah-langkah berikut bersifat opsional.

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

  1. Klik Add 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 Add item. Kemudian, tambahkan kunci dan nilai label seperti yang disebutkan di langkah 2 dan 3.
  5. Klik Continue.
Meninjau setelan

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

gcloud

  1. Buat kumpulan CA untuk CA subordinat:

    gcloud privateca pools create SUBORDINATE_POOL_ID --location=LOCATION
    

    Ganti kode berikut:

    • SUBORDINATE_POOL_ID: nama kumpulan CA.
    • LOCATION: lokasi tempat Anda ingin membuat kumpulan CA. Untuk mengetahui daftar lengkap lokasi, lihat Lokasi.

    Untuk mengetahui informasi selengkapnya tentang cara membuat kumpulan CA, lihat Membuat kumpulan CA.

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

  2. Buat CA subordinat di kumpulan CA yang dibuat.

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
        --pool=SUBORDINATE_POOL_ID \
        --location=LOCATION \
        --issuer-pool=ISSUER_POOL_ID \
        --issuer-location=ISSUER_LOCATION \
        --key-algorithm="ec-p256-sha256" \
        --subject="CN=Example Server TLS CA, O=Example LLC"
    

    Ganti kode berikut:

    • SUBORDINATE_CA_ID: ID unik CA subordinat.
    • SUBORDINATE_POOL_ID: nama kumpulan CA.
    • LOCATION: lokasi kumpulan CA.
    • ISSUER_POOL_ID: nama kumpulan CA yang berisi CA penerbit.
    • ISSUER_LOCATION: lokasi kumpulan CA yang berisi CA penerbit.

      Flag --key-algorithm menentukan algoritme kriptografi yang ingin Anda gunakan untuk membuat kunci Cloud HSM terkelola untuk CA.

      Flag --subject menentukan nama X.501 subjek sertifikat.

    Untuk membuat CA subordinat menggunakan kunci penandatanganan yang dikelola pelanggan, jalankan perintah berikut:

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
        --pool=SUBORDINATE_POOL_ID \
        --location=LOCATION \
        --issuer-pool=ISSUER_POOL_ID \
        --issuer-location=ISSUER_LOCATION \
        --kms-key-version=KMS_KEY_VERSION \
        --subject="CN=Example Server TLS CA, O=Example LLC"
    

    Ganti kode berikut:

    • SUBORDINATE_POOL_ID: nama kumpulan CA.
    • LOCATION: lokasi kumpulan CA.
    • ISSUER_POOL_ID: nama kumpulan CA yang berisi CA penerbit.
    • ISSUER_LOCATION: lokasi kumpulan CA yang berisi CA penerbit.
    • KMS_KEY_VERSION: ID resource lengkap versi kunci kripto Cloud KMS yang dikelola pelanggan untuk digunakan sebagai kunci penandatanganan.

    Untuk mengetahui detail selengkapnya tentang opsi kunci penandatanganan dan menyiapkan kunci penandatanganan yang dikelola pelanggan, lihat Mengonfigurasi kunci penandatanganan CA.

    Pernyataan berikut ditampilkan saat CA subordinat dibuat.

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

    Untuk menentukan URL akses Authority Information Access (AIA) dan CRL Distribution Point (CDP) kustom, gunakan flag --custom-aia-urls dan --custom-cdp-urls. Jika ditentukan, URL ini akan disertakan dalam semua sertifikat yang diterbitkan oleh CA dan menggantikan URL akses bucket Cloud Storage default.

    Untuk melihat daftar lengkap setelan, jalankan perintah gcloud berikut:

    gcloud privateca subordinates create --help
    

    Perintah ini menampilkan contoh untuk membuat CA subordinat yang penerbitnya berada di CA Service atau berada di tempat lain.

Terraform

resource "google_privateca_certificate_authority" "root_ca" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                                   = "my-pool"
  certificate_authority_id               = "my-certificate-authority-root"
  location                               = "us-central1"
  deletion_protection                    = false # set to true to prevent destruction of the resource
  ignore_active_certificates_on_deletion = true
  config {
    subject_config {
      subject {
        organization = "ACME"
        common_name  = "my-certificate-authority"
      }
    }
    x509_config {
      ca_options {
        # is_ca *MUST* be true for certificate authorities
        is_ca = true
      }
      key_usage {
        base_key_usage {
          # cert_sign and crl_sign *MUST* be true for certificate authorities
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
        }
      }
    }
  }
  key_spec {
    algorithm = "RSA_PKCS1_4096_SHA256"
  }
  // valid for 10 years
  lifetime = "${10 * 365 * 24 * 3600}s"
}

resource "google_privateca_certificate_authority" "sub_ca" {
  // This example assumes this pool already exists.
  // Pools cannot be deleted in normal test circumstances, so we depend on static pools
  pool                     = "my-sub-pool"
  certificate_authority_id = "my-certificate-authority-sub"
  location                 = "us-central1"
  deletion_protection      = false # set to true to prevent destruction of the resource
  subordinate_config {
    certificate_authority = google_privateca_certificate_authority.root_ca.name
  }
  config {
    subject_config {
      subject {
        organization = "ACME"
        common_name  = "my-subordinate-authority"
      }
    }
    x509_config {
      ca_options {
        is_ca = true
        # Force the sub CA to only issue leaf certs.
        # Use e.g.
        #    max_issuer_path_length = 1
        # if you need to chain more subordinates.
        zero_max_issuer_path_length = true
      }
      key_usage {
        base_key_usage {
          cert_sign = true
          crl_sign  = true
        }
        extended_key_usage {
        }
      }
    }
  }
  // valid for 5 years
  lifetime = "${5 * 365 * 24 * 3600}s"
  key_spec {
    algorithm = "RSA_PKCS1_2048_SHA256"
  }
  type = "SUBORDINATE"
}

Java

Untuk melakukan autentikasi ke CA Service, 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.SubjectAltNames;
import com.google.cloud.security.privateca.v1.X509Parameters;
import com.google.cloud.security.privateca.v1.X509Parameters.CaOptions;
import com.google.longrunning.Operation;
import com.google.protobuf.Duration;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CreateSubordinateCa {

  public static void main(String[] args)
      throws InterruptedException, ExecutionException, IOException {
    // TODO(developer): Replace these variables before running the sample.
    // location: For a list of locations, see:
    // https://cloud.google.com/certificate-authority-service/docs/locations
    // poolId: Set it to the CA Pool under which the CA should be created.
    // subordinateCaName: Unique name for the Subordinate CA.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    String subordinateCaName = "subordinate-certificate-authority-name";

    createSubordinateCertificateAuthority(project, location, poolId, subordinateCaName);
  }

  public static void createSubordinateCertificateAuthority(
      String project, String location, String poolId, String subordinateCaName)
      throws IOException, ExecutionException, InterruptedException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `certificateAuthorityServiceClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (CertificateAuthorityServiceClient certificateAuthorityServiceClient =
        CertificateAuthorityServiceClient.create()) {

      String commonName = "commonname";
      String orgName = "csr-org-name";
      String domainName = "dns.example.com";
      int caDuration = 100000; // Validity of this CA in seconds.

      // Set the type of Algorithm.
      KeyVersionSpec keyVersionSpec =
          KeyVersionSpec.newBuilder().setAlgorithm(SignHashAlgorithm.RSA_PKCS1_4096_SHA256).build();

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

      //  Set the key usage options for X.509 fields.
      X509Parameters x509Parameters =
          X509Parameters.newBuilder()
              .setKeyUsage(
                  KeyUsage.newBuilder()
                      .setBaseKeyUsage(
                          KeyUsageOptions.newBuilder().setCrlSign(true).setCertSign(true).build())
                      .build())
              .setCaOptions(CaOptions.newBuilder().setIsCa(true).build())
              .build();

      // Set certificate authority settings.
      CertificateAuthority subCertificateAuthority =
          CertificateAuthority.newBuilder()
              .setType(CertificateAuthority.Type.SUBORDINATE)
              .setKeySpec(keyVersionSpec)
              .setConfig(
                  CertificateConfig.newBuilder()
                      .setSubjectConfig(subjectConfig)
                      .setX509Config(x509Parameters)
                      .build())
              // Set the CA validity duration.
              .setLifetime(Duration.newBuilder().setSeconds(caDuration).build())
              .build();

      // Create the CertificateAuthorityRequest.
      CreateCertificateAuthorityRequest subCertificateAuthorityRequest =
          CreateCertificateAuthorityRequest.newBuilder()
              .setParent(CaPoolName.of(project, location, poolId).toString())
              .setCertificateAuthorityId(subordinateCaName)
              .setCertificateAuthority(subCertificateAuthority)
              .build();

      // Create Subordinate CA.
      ApiFuture<Operation> futureCall =
          certificateAuthorityServiceClient
              .createCertificateAuthorityCallable()
              .futureCall(subCertificateAuthorityRequest);

      Operation response = futureCall.get();

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

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

Python

Untuk melakukan autentikasi ke CA Service, 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_subordinate_ca(
    project_id: str,
    location: str,
    ca_pool_name: str,
    subordinate_ca_name: str,
    common_name: str,
    organization: str,
    domain: str,
    ca_duration: int,
) -> None:
    """
    Create Certificate Authority (CA) which is the subordinate CA in the given CA Pool.
    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
        ca_pool_name: set it to the CA Pool under which the CA should be created.
        subordinate_ca_name: unique name for the Subordinate CA.
        common_name: a title for your certificate authority.
        organization: the name of your company for your certificate authority.
        domain: the name of your company for your certificate authority.
        ca_duration: the validity of the certificate authority in seconds.
    """

    ca_service_client = privateca_v1.CertificateAuthorityServiceClient()

    # Set the type of Algorithm
    key_version_spec = privateca_v1.CertificateAuthority.KeyVersionSpec(
        algorithm=privateca_v1.CertificateAuthority.SignHashAlgorithm.RSA_PKCS1_4096_SHA256
    )

    # Set CA subject config.
    subject_config = privateca_v1.CertificateConfig.SubjectConfig(
        subject=privateca_v1.Subject(
            common_name=common_name, organization=organization
        ),
        # Set the fully qualified domain name.
        subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain]),
    )

    # Set the key usage options for X.509 fields.
    x509_parameters = privateca_v1.X509Parameters(
        key_usage=privateca_v1.KeyUsage(
            base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                crl_sign=True,
                cert_sign=True,
            )
        ),
        ca_options=privateca_v1.X509Parameters.CaOptions(
            is_ca=True,
        ),
    )

    # Set certificate authority settings.
    certificate_authority = privateca_v1.CertificateAuthority(
        type_=privateca_v1.CertificateAuthority.Type.SUBORDINATE,
        key_spec=key_version_spec,
        config=privateca_v1.CertificateConfig(
            subject_config=subject_config,
            x509_config=x509_parameters,
        ),
        # Set the CA validity duration.
        lifetime=duration_pb2.Duration(seconds=ca_duration),
    )

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

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

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

    print(f"Operation result: {result}")

Mengaktifkan CA subordinat

Untuk mengaktifkan CA subordinat, lakukan hal berikut:

Konsol

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

    Buka Certificate Authority Service

  2. Klik tab CA manager.

  3. Di bagian Certificate authorities, pilih CA yang ingin Anda aktifkan.

  4. Klik Activate.

  5. Di dialog yang terbuka, klik Download CSR untuk mendownload file CSR berenkode PEM yang dapat ditandatangani oleh CA penerbit.

  6. Klik Next.

  7. Di kolom Upload Certificate Chain, klik Browse.

  8. Upload file sertifikat yang ditandatangani dengan ekstensi .crt.

  9. Klik Activate.

gcloud

Untuk mengaktifkan CA subordinat yang baru dibuat, jalankan perintah berikut:

gcloud privateca subordinates enable SUBORDINATE_CA_ID \
--pool=SUBORDINATE_POOL_ID \
--location=LOCATION

Ganti kode berikut:

  • SUBORDINATE_CA_ID: ID unik CA subordinat.
  • SUBORDINATE_POOL_ID: nama kumpulan CA yang berisi CA subordinat.
  • LOCATION: lokasi kumpulan CA. Untuk mengetahui daftar lengkap lokasi, lihat Lokasi.

Untuk mengetahui informasi selengkapnya tentang gcloud privateca subordinates enable perintah, lihat gcloud privateca subordinates enable.

Terraform

Tetapkan kolom desired_state ke ENABLED di CA subordinat dan jalankan terraform apply.

Langkah berikutnya