Membuat certificate authority subordinat

Dokumen ini menjelaskan langkah-langkah untuk membuat certificate authority (Sub CA) subordinat.

Sub CA bertanggung jawab untuk menerbitkan sertifikat langsung ke entitas akhir, seperti pengguna, komputer, dan perangkat. Sub CA ditandatangani secara kriptografi oleh CA induk, sering kali root CA. Sistem yang mempercayai root CA akan otomatis mempercayai 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 akan membuat permintaan penandatanganan sertifikat (CSR) yang harus ditandatangani oleh CA eksternal.

Dokumen ini ditujukan untuk audiens dalam grup operator aplikasi, seperti developer aplikasi atau ilmuwan data, yang mengelola siklus proses sertifikat dalam project mereka. Untuk mengetahui informasi selengkapnya, lihat Audiens untuk dokumentasi GDC air-gapped.

Sebelum memulai

Sebelum dapat membuat Sub CA, Anda harus meminta izin yang diperlukan dan menyiapkan lingkungan.

Meminta peran IAM

Untuk membuat, memperbarui, dan menghapus resource certificate authority, hubungi Admin IAM Organisasi Anda untuk meminta peran Certificate Authority Service Admin (certificate-authority-service-admin) di namespace project certificate authority.

Menyiapkan lingkungan Anda

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.

  1. Buat resource CertificateAuthority dan simpan sebagai file YAML bernama subca.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_ENABLED
    

    Ganti 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 yang diminta untuk sertifikat CA.
    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 diperpanjang untuk sertifikat. Jika disediakan, nilai yang diizinkan adalah serverAuth dan clientAuth.
    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 algoritma. 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.
  2. Terapkan resource kustom ke instance Distributed Cloud Anda:

    kubectl apply -f subca.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    

    Ganti MANAGEMENT_API_SERVER_KUBECONFIG dengan jalur ke file kubeconfig server Management API.

  3. Verifikasi kesiapan Sub CA. CA memerlukan waktu sekitar 40 menit untuk 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 leaf dengan CA eksternal atau yang dikelola pengguna. Sub CA ini membuat CSR untuk ditandatangani pengguna.

  1. Buat resource CertificateAuthority dan simpan sebagai file YAML bernama subca-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_ENABLED
    

    Ganti 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 yang diminta untuk sertifikat 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.
    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 diperpanjang untuk sertifikat. Jika disediakan, nilai yang diizinkan adalah serverAuth dan clientAuth.
    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 algoritma. 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.
  2. Terapkan resource kustom ke instance Distributed Cloud Anda:

    kubectl apply -f subca-external.yaml --kubeconfig MANAGEMENT_API_SERVER_KUBECONFIG
    
  3. CSR untuk Sub-CA dibuat dalam server GDC Management API. Anda harus mendownload CSR dan menandatanganinya. Setelah ditandatangani, Anda dapat mengupload sertifikat yang ditandatangani ke server GDC Management API.

  4. 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"' | bash
    

    Perintah ini akan membuat file CSR bernama sub_ca.csr di direktori saat ini. File ini berisi CSR untuk sertifikat CA X.509.

  5. Gunakan root CA pelanggan untuk meminta sertifikat CA yang ditandatangani untuk file sub_ca.csr.

  6. Untuk permintaan penandatanganan sertifikat yang disetujui, Anda harus mendapatkan sertifikat CA yang ditandatangani oleh root CA pelanggan. Simpan sertifikat di file sub_ca.crt di direktori saat ini.

  7. Jika berlaku, dapatkan sertifikat root CA pelanggan dan simpan di file ca.crt di direktori saat ini.

  8. Verifikasi ekstensi Nama Alternatif Subjek (SAN) dalam sertifikat:

    openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject Alternative Name"
    

    Jika sertifikat CA memiliki Nama Umum (CN), bukan SAN, verifikasi CN dalam sertifikat:

    openssl x509 -text -noout -in sub_ca.crt | grep -A 1 "Subject: CN"
    
  9. Buat spec untuk menambal resource CertificateAuthority:

    echo "spec:
      caCertificate:
        externalCA:
          signedCertificate:
            certificate: $(base64 -w0 SUB_CA_NAME.crt)
            ca: $(base64 -w0 ca.crt)" > patch.txt
    

    Konten dalam file patch.txt akan terlihat mirip seperti berikut:

    spec:
      caCertificate:
        externalCA:
          signedCertificate:
            certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURSekNDQ…
            ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURRVENDQ…
    
  10. Edit kolom spec dari resource CertificateAuthority:

    kubectl patch certificateauthority SUB_CA_NAME -n USER_PROJECT_NAMESPACE--patch-file patch.txt --type='merge'
    
  11. Verifikasi kesiapan Sub CA bawa sendiri (BYO). CA biasanya memerlukan waktu sekitar 40 menit untuk 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"
    }
    
  12. 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 Distributed Cloud air-gapped 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