Meminta sertifikat dan melihat sertifikat yang diterbitkan

Topik ini menjelaskan cara meminta sertifikat dari Certificate Authority Service dan melihat sertifikat yang diterbitkan.

Sebelum memulai

Pastikan Anda memiliki peran Pemohon Sertifikat Layanan CA (roles/privateca.certificateRequester) atau peran IAM Pengelola Sertifikat Layanan CA (roles/privateca.certificateManager). Untuk mengetahui informasi selengkapnya tentang peran IAM yang telah ditetapkan untuk Layanan CA, lihat Kontrol akses dengan IAM.

Untuk mengetahui informasi tentang cara memberikan peran IAM kepada akun utama, lihat Memberikan satu peran.

Ringkasan

Anda dapat meminta sertifikat menggunakan metode berikut:

  1. Buat kunci pribadi atau publik Anda sendiri dan kirimkan Permintaan Penandatanganan Sertifikat (CSR).
  2. Minta CA Service membuat kunci pribadi atau kunci publik untuk Anda.
  3. Menggunakan kunci Cloud Key Management Service (Cloud KMS) yang sudah ada.

Meminta sertifikat menggunakan CSR

Sebelum melanjutkan, Anda harus membuat CSR. Setelah membuat CSR, lakukan hal berikut:

Konsol

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

    Buka Certificate Authority Service

  2. Klik tab Pengelola CA.

  3. Klik nama CA yang ingin Anda terbitkan.

  4. Di bagian bawah halaman detail CA, klik Minta sertifikat.

  5. Opsional: Jika Anda ingin menggunakan certificate template, klik , pilih template dari daftar, lalu klik Save.

  6. Klik Provide CSR.

  7. Opsional: Untuk menimpa nama sertifikat yang dibuat secara otomatis, masukkan nama kustom di kolom Nama sertifikat.

  8. Opsional: Guna memilih periode validitas kustom untuk sertifikat, masukkan nilai di kolom Valid for.

  9. Salin dan tempel CSR Anda ke kotak Certificate CSR. Untuk mengupload CSR, klik Browse.

  10. Klik Next.

Download sertifikat yang ditandatangani

  1. Untuk menyalin sertifikat, klik . Untuk mendownload sertifikat dalam bentuk file .crt, klik Download sertifikat.
  2. Opsional: Untuk mendownload rantai sertifikat, klik Download rantai sertifikat.
  3. Klik Done.

gcloud

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

Ganti kode berikut:

  • CERT_ID: ID unik sertifikat.
  • POOL_ID: Nama kumpulan CA.
  • CSR_FILENAME: File yang menyimpan CSR berenkode PEM.

Flag --validity menentukan durasi sertifikat valid. Tanda ini merupakan tanda opsional yang nilai defaultnya adalah 30 hari.

Untuk mengetahui informasi selengkapnya tentang perintah gcloud privateca certificates create, lihat gcloud privateca certificate 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"
  }
}

REST API

  1. Buat Permintaan Penandatanganan Sertifikat (CSR) menggunakan metode pilihan Anda, seperti openssl.

    Berikut adalah contoh CSR yang dienkode untuk 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. Minta sertifikat.

    Metode HTTP dan URL:

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

    Meminta isi JSON:

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

    Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

    Anda akan melihat respons JSON seperti berikut:

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

Minta sertifikat menggunakan kunci yang dibuat secara otomatis

Konsol

Anda dapat menggunakan konsol Google Cloud untuk membuat sertifikat TLS klien atau server.

  1. Di konsol Google Cloud, buka halaman Certificate Authority Service.

    Buka Certificate Authority Service

  2. Klik tab Pengelola CA.

  3. Klik nama CA yang ingin Anda terbitkan.

  4. Di bagian bawah halaman detail Certificate authority, klik Request a certificate.

  5. Opsional: Jika Anda ingin menggunakan certificate template, klik , pilih template dari daftar, lalu klik Save.

  6. Klik Masukkan detail.

  7. Opsional: Ganti Nama sertifikat yang dibuat secara otomatis dengan nama kustom yang unik.

  8. Opsional: Guna memilih periode validitas kustom untuk sertifikat, masukkan nilai di kolom Valid for.

Tambahkan nama domain

  1. Di bagian Add domain name, masukkan nama domain di kolom Domain name 1.
  2. Opsional: Jika Anda ingin menambahkan lebih dari satu nama domain, klik Tambahkan Item, lalu masukkan nama domain lain di kolom Nama domain 2.

Penggunaan kunci yang diperpanjang

  1. Opsional: Di bagian Extended key usage, pilih antara opsi berikut berdasarkan kasus penggunaan Anda:

    • TLS Server: Sertifikat ini memungkinkan Anda mengautentikasi identitas server.
    • TLS klien: Sertifikat ini memungkinkan Anda mengautentikasi identitas pemohon.
  2. Klik Next.

Mengonfigurasi ukuran dan algoritma kunci

  1. Opsional: Di bagian Configure key size and algorithm, pilih ukuran kunci penandatanganan dan algoritma dari daftar. Jika Anda melewati langkah ini, kunci 2048 bit RSASA-PSS dengan ringkasan SHA 256 akan digunakan. Untuk mengetahui informasi tentang memilih kunci penandatanganan dan algoritma, lihat Memilih algoritma kunci.
  2. Klik Lanjutkan.

Download sertifikat yang ditandatangani

  1. Opsional: Untuk mendownload rantai sertifikat yang dienkode ke PEM, klik Download rantai sertifikat.
  2. Opsional: Untuk mendownload kunci pribadi terkait yang dienkode ke PEM, klik Download kunci pribadi.

  3. Klik Done.

gcloud

Untuk menggunakan fitur kunci yang dibuat secara otomatis, Anda perlu menginstal library Python Cryptographic Authority (PyCA). Untuk petunjuk tentang cara menginstal library kriptografi Pyca, lihat Menyertakan library kriptografi Pyca.

Untuk membuat sertifikat, gunakan perintah gcloud berikut:

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

Ganti kode berikut:

  • POOL_ID: Nama kumpulan CA.
  • KEY_FILENAME: Jalur tempat file kunci pribadi yang dihasilkan harus ditulis.
  • CERT_FILENAME: Jalur tempat file rantai sertifikat yang dienkode PE harus ditulis. Rantai sertifikat diurutkan dari entitas akhir ke {i>root<i}.
  • DNS_NAME: Satu atau beberapa nama alternatif subjek DNS (SAN) yang dipisahkan koma.
  • CERTIFICATE_PROFILE: ID unik profil sertifikat. Misalnya, gunakan leaf_server_tls untuk TLS server entity akhir.

Perintah gcloud menyebutkan flag berikut:

  • --generate-key: Membuat kunci pribadi RSA-2048 baru di komputer Anda.

Anda juga dapat menggunakan kombinasi flag berikut:

  • --dns-san: Memungkinkan Anda meneruskan satu atau beberapa SAN DNS yang dipisahkan koma.
  • --ip-san: Memungkinkan Anda meneruskan satu atau beberapa SAN IP yang dipisahkan koma.
  • --uri-san: Memungkinkan Anda meneruskan satu atau beberapa SAN URI yang dipisahkan koma.
  • --subject: Memungkinkan Anda meneruskan nama X.501 subjek sertifikat.

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

Go

Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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 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

Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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.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

Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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)

Meminta sertifikat menggunakan kunci Cloud KMS yang ada

Untuk menggunakan kunci Cloud KMS guna membuat sertifikat TLS server entity akhir, jalankan perintah berikut:

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

Ganti kode berikut:

  • POOL_ID: Nama kumpulan CA.
  • PROJECT_ID: Project ID.
  • LOCATION_ID: Lokasi key ring.
  • KEY_RING: Nama key ring tempat kunci tersebut berada.
  • KEY: Nama kunci.
  • KEY_VERSION: Versi kunci.
  • CERT_FILENAME: Jalur file rantai sertifikat yang dienkode ke PEM. File rantai sertifikat diurutkan dari entity akhir ke root.
  • DNS_NAME: SAN DNS yang dipisahkan koma.

Menjalankan operasi umum dengan sertifikat

Bagian ini menjelaskan cara melakukan operasi umum tertentu dengan sertifikat.

Menerbitkan sertifikat dari CA tertentu dalam kumpulan CA

gcloud

Untuk menargetkan CA tertentu dalam kumpulan CA untuk penerbitan sertifikat, tambahkan flag --ca dengan CA_ID CA yang harus menerbitkan sertifikat.

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

Konsol

Konsol Google Cloud hanya mendukung penerbitan sertifikat dari CA tertentu. Ikuti petunjuk di bagian Minta sertifikat menggunakan Kunci yang dibuat otomatis atau bagian Minta sertifikat menggunakan CSR untuk memilih CA yang harus menerbitkan sertifikat.

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
}

Lihat sertifikat yang diterbitkan

Konsol

  1. Di konsol Google Cloud, buka halaman Certificate Authority Service.

    Buka Certificate Authority Service

  2. Klik tab Pengelola CA.

  3. Di halaman Certificate authority, klik nama CA.

  4. Di bagian bawah halaman detail Certificate authority, klik Lihat sertifikat yang diterbitkan untuk melihat daftar sertifikat yang diterbitkan oleh CA.

    Anda dapat melihat sertifikat di halaman Semua sertifikat. Detailnya mencakup status sertifikat, CA yang menerbitkan, kumpulan CA yang berisi CA, tanggal habis masa berlaku sertifikat, dan lainnya.

gcloud

Untuk mencantumkan semua sertifikat yang diterbitkan oleh CA tertentu dalam kumpulan CA, gunakan perintah gcloud berikut:

gcloud privateca certificates list --issuer-pool ISSUER_POOL --ca CA_NAME

Untuk mengetahui informasi selengkapnya tentang perintah gcloud privateca certificates list, lihat gcloud privateca certificate list.

Untuk mencantumkan semua sertifikat di semua CA di lokasi tertentu, gunakan perintah gcloud berikut:

gcloud privateca certificates list --location LOCATION

Go

Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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/api/iterator"
)

// List Certificates present in the given CA pool.
func listCertificates(
	w io.Writer,
	projectId string,
	location string,
	caPoolId 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 CA Pool id in which the certificate exists.

	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", projectId, location, caPoolId)

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

	it := caClient.ListCertificates(ctx, req)
	for {
		resp, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("unable to get the list of cerficates: %w", err)
		}

		fmt.Fprintf(w, " - %s (common name: %s)", resp.Name,
			resp.CertificateDescription.SubjectDescription.Subject.CommonName)
	}

	return nil
}

Java

Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


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 java.io.IOException;

public class ListCertificates {

  public static void main(String[] args) throws 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: Id of the CA pool which contains the certificates to be listed.
    String project = "your-project-id";
    String location = "ca-location";
    String poolId = "ca-pool-id";
    listCertificates(project, location, poolId);
  }

  // List Certificates present in the given CA pool.
  public static void listCertificates(String project, String location, String poolId)
      throws 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()) {

      CaPoolName caPool =
          CaPoolName.newBuilder()
              .setProject(project)
              .setLocation(location)
              .setCaPool(poolId)
              .build();

      // Retrieve and print the certificate names.
      System.out.println("Available certificates: ");
      for (Certificate certificate :
          certificateAuthorityServiceClient.listCertificates(caPool).iterateAll()) {
        System.out.println(certificate.getName());
      }
    }
  }
}

Python

Untuk mengautentikasi ke CA Service, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.


import google.cloud.security.privateca_v1 as privateca_v1

def list_certificates(
    project_id: str,
    location: str,
    ca_pool_name: str,
) -> None:
    """
    List Certificates present 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: name of the CA pool which contains the certificates to be listed.
    """

    caServiceClient = privateca_v1.CertificateAuthorityServiceClient()

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

    # Retrieve and print the certificate names.
    print(f"Available certificates in CA pool {ca_pool_name}:")
    for certificate in caServiceClient.list_certificates(parent=ca_pool_path):
        print(certificate.name)

Melihat detail untuk satu sertifikat

Konsol

  1. Di konsol Google Cloud, buka halaman Certificate Authority Service.

    Buka Certificate Authority Service

  2. Pilih CA target di tab Pengelola CA.

  3. Klik nama CA.

  4. Di bagian bawah halaman detail Otoritas sertifikat, klik Lihat sertifikat yang diterbitkan untuk melihat daftar sertifikat yang diterbitkan.

  5. Klik di kolom Tindakan untuk sertifikat yang ingin didownload.

  6. Di bagian Download, klik Sertifikat. Anda dapat mendownload rantai sertifikat dengan mengklik Rantai sertifikat.

gcloud

Untuk melihat deskripsi lengkap sertifikat, jalankan perintah berikut:

gcloud privateca certificates describe CERT_NAME \
    --issuer-pool POOL_ID

Untuk mengetahui informasi lebih lanjut tentang perintah gcloud privateca certificates describe, lihat gcloud privateca certificate explain.

Untuk mengekspor rantai sertifikat X.509 berenkode PEM ke file, jalankan perintah berikut:

gcloud privateca certificates export CERT_NAME \
    --issuer-pool POOL_ID \
    --include-chain \
    --output-file certificate-file

Untuk mengetahui informasi selengkapnya tentang perintah gcloud privateca certificates export, lihat ekspor sertifikat gcloud privateca.

Bukti kepemilikan sertifikat

Bukti kepemilikan kunci pribadi memastikan bahwa pemohon sertifikat memegang kunci pribadi untuk sertifikat tersebut. CA Service akan memeriksa bukti kepemilikan hanya jika pemohon memberikan CSR PKCS #10 sesuai dengan RFC 2986. Bukti kepemilikan untuk bentuk permintaan sertifikat lainnya, seperti permintaan dari CertificateConfig tidak diterapkan.

Aplikasi klien yang menerima sertifikat bertanggung jawab untuk memvalidasi apakah pemegang sertifikat memiliki kunci pribadi dari sertifikat tersebut. Menegakkan pemeriksaan bukti kepemilikan selama penerbitan sertifikat adalah bentuk pertahanan mendalam untuk memberikan perlindungan dari klien yang berperilaku tidak semestinya. Keberadaan klien tersebut, terlepas dari apakah CA memeriksa bukti kepemilikan atau tidak, dapat merupakan kerentanan keamanan.

Langkah selanjutnya