Dokumen ini menjelaskan langkah-langkah untuk membuat certificate authority subordinat (Sub CA).
Sub CA bertanggung jawab untuk menerbitkan sertifikat langsung ke entitas akhir, seperti pengguna, komputer, dan perangkat. Sertifikat ini ditandatangani secara kriptografis oleh CA induk, yang sering kali merupakan root CA. Sistem yang memercayai root CA akan otomatis memercayai Sub CA dan sertifikat yang diterbitkannya.
Penanda tangan sertifikat CA dapat berupa CA lain yang dibuat di CA Service, misalnya, root CA, atau CA eksternal. Dengan CA eksternal, CA Service membuat permintaan penandatanganan sertifikat (CSR) yang harus ditandatangani oleh CA eksternal.
Dokumen ini ditujukan untuk audiens dalam grup operator aplikasi, seperti developer aplikasi atau data scientist, yang mengelola siklus proses sertifikat dalam project mereka. Untuk mengetahui informasi selengkapnya, lihat Audiens untuk dokumentasi GDC dengan air gap.
Sebelum memulai
Sebelum dapat membuat Sub CA, Anda harus meminta izin yang diperlukan dan menyiapkan lingkungan Anda.
Meminta peran IAM
Untuk membuat, memperbarui, dan menghapus resource certificate authority, hubungi Admin Org IAM Anda untuk meminta peran Certificate Authority Service Admin (certificate-authority-service-admin) di namespace project certificate authority.
Menyiapkan lingkungan Anda
Download dan instal gdcloud CLI, jika Anda belum melakukannya.
Buat file kubeconfig untuk mengonfigurasi akses
kubectl.
Membuat Sub CA terkelola
Untuk Sub CA terkelola, penanda tangan sertifikat CA adalah CA lain (root CA) yang dibuat di CA Service.
Untuk membuat Sub CA terkelola, terapkan resource kustom ke instance Distributed Cloud Appliance Anda.
Buat resource
CertificateAuthoritydan simpan sebagai file YAML bernamasubca.yaml:apiVersion: pki.security.gdc.goog/v1 kind: CertificateAuthority metadata: Name: SUB_CA_NAME namespace: USER_PROJECT_NAMESPACE spec: caProfile: commonName: COMMON_NAME duration: DURATION renewBefore: RENEW_BEFORE organizations: - ORGANIZATIONS organizationalUnits: - ORGANIZATIONAL_UNITS countries: - COUNTRIES localities: - LOCALITIES provinces: - PROVINCES streetAddresses: - STREET_ADDRESSES postalCodes: - POSTAL_CODES caCertificate: managedSubCA: certificateAuthorityRef: name: ROOT_CA_NAME namespace: USER_PROJECT_NAMESPACE certificateProfile: keyUsage: - digitalSignature - keyCertSign - crlSign extendedKeyUsage: - EXTENDED_KEY_USAGE secretConfig: secretName: SECRET_NAME privateKeyConfig: algorithm: KEY_ALGORITHM size: KEY_SIZE acme: enabled: ACME_ENABLEDGanti variabel berikut:
Variabel Deskripsi SUB_CA_NAME Nama Sub CA. USER_PROJECT_NAMESPACE Nama namespace tempat project pengguna berada. COMMON_NAME Nama umum sertifikat CA. DURATION Masa berlaku sertifikat CA yang diminta. Tentukan sebagai durasi dalam jam (misalnya, 1000h). Unit seperti hari (d) atau tahun (y) tidak didukung.ROOT_CA_NAME Nama root CA. SECRET_NAME Nama Secret Kubernetes yang menyimpan kunci pribadi dan sertifikat CA yang ditandatangani. Variabel berikut adalah nilai opsional:
Variabel Deskripsi RENEW_BEFORE Waktu rotasi sebelum masa berlaku sertifikat CA berakhir. ORGANIZATIONS Organisasi yang akan digunakan pada sertifikat. ORGANIZATIONAL_UNITS Unit organisasi yang akan digunakan pada sertifikat. COUNTRIES Negara yang akan digunakan pada sertifikat. LOCALITIES Kota yang akan digunakan pada sertifikat. PROVINCES Negara Bagian atau Provinsi yang akan digunakan pada sertifikat. STREET_ADDRESSES Alamat jalan yang akan digunakan pada sertifikat. POSTAL_CODES Kode pos yang akan digunakan pada sertifikat. EXTENDED_KEY_USAGE Penggunaan kunci yang diperluas untuk sertifikat. Jika diberikan, nilai yang diizinkan adalah serverAuthdanclientAuth.KEY_ALGORITHYM Algoritma kunci pribadi yang digunakan untuk sertifikat ini. Nilai yang diizinkan adalah RSA, Ed25519, atau ECDSA. Jika ukuran tidak diberikan, nilai defaultnya adalah 256 untuk ECDSA dan 2048 untuk RSA. Ukuran kunci diabaikan untuk Ed25519. KEY_SIZE Ukuran, dalam bit, kunci pribadi untuk sertifikat ini bergantung pada algoritmanya. RSA mengizinkan 2048, 3072, 4096, atau 8192 (default 2048). ECDSA mengizinkan 256, 384, atau 521 (default 256). Ed25519 mengabaikan ukuran. ACME_ENABLED Jika disetel ke true, CA akan berjalan dalam mode ACME dan menampilkan URL server ACME. Kemudian, Anda dapat menggunakan klien dan protokol ACME untuk mengelola sertifikat.Terapkan resource kustom ke instance Distributed Cloud Anda:
kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIGGanti
MANAGEMENT_API_SERVER_KUBECONFIGdengan jalur ke file kubeconfig server Management API.Verifikasi kesiapan Sub CA. Perlu waktu ~40 menit agar CA siap:
kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthority.pki.security.gdc.goog/SUB_CA_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'Outputnya akan terlihat mirip seperti berikut:
{ "lastTransitionTime": "2025-01-24T17:09:29Z", "message": "CA reconciled", "observedGeneration": 2, "reason": "Ready", "status": "True", "type": "Ready" }
Membuat Sub CA dari CA eksternal
Sub CA ini mendukung penandatanganan sertifikat entitas akhir dengan CA eksternal atau yang dikelola pengguna. CSR ini menghasilkan CSR untuk ditandatangani pengguna.
Buat resource
CertificateAuthoritydan simpan sebagai file YAML bernamasubca-external.yaml:apiVersion: pki.security.gdc.goog/v1 kind: CertificateAuthority metadata: Name: SUB_CA_NAME namespace: USER_PROJECT_NAMESPACE spec: caProfile: commonName: COMMON_NAME duration: DURATION renewBefore: RENEW_BEFORE organizations: - ORGANIZATION organizationalUnits: - ORGANIZATIONAL_UNITS countries: - COUNTRIES localities: - LOCALITIES provinces: - PROVINCES streetAddresses: - STREET_ADDRESSES postalCodes: - POSTAL_CODES caCertificate: externalCA: {} certificateProfile: keyUsage: - digitalSignature - keyCertSign - crlSign extendedKeyUsage: - EXTENDED_KEY_USAGE secretConfig: secretName: SECRET_NAME privateKeyConfig: algorithm: KEY_ALGORITHM size: KEY_SIZE acme: enabled: ACME_ENABLEDGanti variabel berikut:
Variabel Deskripsi SUB_CA_NAME Nama subCA. USER_PROJECT_NAMESPACE Project ID untuk project tempat Anda ingin mengimpor image. COMMON_NAME Nama umum sertifikat CA. DURATION Masa berlaku sertifikat CA yang diminta. Tentukan sebagai durasi dalam jam (misalnya, 1000h). Unit seperti hari (d) atau tahun (y) tidak didukung.SECRET_NAME Nama Secret Kubernetes yang menyimpan kunci pribadi dan sertifikat CA yang ditandatangani. Variabel berikut adalah nilai opsional:
Variabel Deskripsi RENEW_BEFORE Waktu rotasi sebelum masa berlaku sertifikat CA berakhir. ORGANIZATION Organisasi yang akan digunakan pada sertifikat. ORGANIZATIONAL_UNITS Unit organisasi yang akan digunakan pada sertifikat. COUNTRIES Negara yang akan digunakan pada sertifikat. LOCALITIES Kota yang akan digunakan pada sertifikat. PROVINCES Negara Bagian atau Provinsi yang akan digunakan pada sertifikat. STREET_ADDRESSES Alamat jalan yang akan digunakan pada sertifikat. POSTAL_CODES Kode pos yang akan digunakan pada sertifikat. EXTENDED_KEY_USAGE Penggunaan kunci yang diperluas untuk sertifikat. Jika diberikan, nilai yang diizinkan adalah serverAuthdanclientAuth.KEY_ALGORITHYM Algoritma kunci pribadi yang digunakan untuk sertifikat ini. Nilai yang diizinkan adalah RSA,Ed25519, atauECDSA. Jika ukuran tidak diberikan, nilai defaultnya adalah 256 untukECDSAdan 2048 untukRSA. Ukuran kunci diabaikan untukEd25519.KEY_SIZE Ukuran, dalam bit, kunci pribadi untuk sertifikat ini bergantung pada algoritmanya. RSAmengizinkan 2048, 3072, 4096, atau 8192 (default 2048).ECDSAmengizinkan 256, 384, atau 521 (default 256).Ed25519mengabaikan ukuran.ACME_ENABLED Jika disetel ke true, CA akan berjalan dalam mode ACME dan menampilkan URL server ACME. Kemudian, Anda dapat menggunakan klien dan protokol ACME untuk mengelola sertifikat.Terapkan resource kustom ke instance Distributed Cloud Anda:
kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIGCSR untuk Sub-CA dibuat dalam server API Pengelolaan GDC. Anda harus mendownload CSR dan menandatanganinya. Setelah ditandatangani, Anda dapat mengupload sertifikat yang ditandatangani ke server API Pengelolaan GDC.
Kumpulkan permintaan penandatanganan sertifikat (CSR) dari lingkungan Distributed Cloud Anda:
kubectl get certificateauthorities SUB_CA_NAME -n USER_PROJECT_NAMESPACE -ojson | jq -j '"echo ", .status.externalCA.csr, " | base64 -d > ","sub_ca.csr\n"' | bashPerintah ini akan membuat file CSR bernama
sub_ca.csrdi direktori saat ini. File ini berisi CSR untuk sertifikat CAX.509.Gunakan CA root pelanggan untuk meminta sertifikat CA yang ditandatangani untuk file
sub_ca.csr.Untuk permintaan penandatanganan sertifikat yang disetujui, Anda harus mendapatkan sertifikat CA yang ditandatangani oleh root CA pelanggan. Simpan sertifikat dalam file
sub_ca.crtdi direktori saat ini.Jika ada, dapatkan sertifikat CA root pelanggan dan simpan di file
ca.crtdi direktori saat ini.Verifikasi Nama Umum (CN) sertifikat CA:
openssl x509 -noout -subject -in sub_ca.crtJika penyiapan Anda memerlukan ekstensi Subject Alternative Name (SAN), verifikasi ekstensi SAN dalam sertifikat:
openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"Buat
specuntuk menerapkan patch pada resourceCertificateAuthority:echo "spec: caCertificate: externalCA: signedCertificate: certificate: $(base64 -w0 SUB_CA_NAME.crt) ca: $(base64 -w0 ca.crt)" > patch.txtKonten dalam file
patch.txtterlihat mirip dengan berikut ini:spec: caCertificate: externalCA: signedCertificate: certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ… ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…Edit kolom
specresourceCertificateAuthority:kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'Verifikasi kesiapan Sub CA bawa sendiri (BYO). Biasanya, perlu waktu sekitar 40 menit agar CA siap:
kubectl -n USER_PROJECT_NAMESPACE get certificateauthority.pki.security.gdc.goog/SUB_CA_NAME -ojson | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id))'Outputnya akan terlihat mirip seperti berikut:
{ "lastTransitionTime": "2024-04-30T22:10:50Z", "message": "Certificate authority is ready for use", "observedGeneration": 3, "reason": "Ready", "status": "True", "type": "Ready" }Verifikasi tanggal habis masa berlaku sertifikat CA yang ditandatangani:
kubectl -n USER_PROJECT_NAMESPACE get secret SECRET_NAME -ojson | jq -j '"echo ", .metadata.name, " $(echo ", .data["tls.crt"], "| base64 -d | openssl x509 -enddate -noout)\n"' | bash
Mencantumkan CA
Untuk mencantumkan semua resource Certificate Authority Service di instance air-gap Distributed Cloud Anda, lakukan hal berikut:
Gunakan parameter certificateauthorities untuk mencantumkan semua resource CertificateAuthority:
kubectl --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG -n USER_PROJECT_NAMESPACE get certificateauthorities
Outputnya akan terlihat mirip seperti berikut:
NAMESPACE NAME READY REASON AGE
foo root-ca True Ready 7h24m
foo sub-ca True Ready 7h24m