Menyiapkan TLS bersama dengan sertifikat yang diberikan pengguna

Halaman ini memberikan petunjuk untuk membuat root certificate dan intermediate certificate yang ditandatangani, lalu mengupload sertifikat tersebut ke resource TrustConfig Pengelola Sertifikat. Jika Anda memiliki sertifikat yang akan diupload, lewati langkah-langkah untuk membuat sertifikat baru.

Anda juga membuat resource keamanan jaringan yang diperlukan untuk mengonfigurasi TLS bersama (mTLS) untuk Load Balancer Aplikasi. Petunjuknya menggunakan OpenSSL untuk membuat root certificate dan intermediate certificate.

Sebelum memulai

Izin

Untuk mendapatkan izin yang Anda perlukan guna menyelesaikan panduan ini, minta administrator Anda untuk memberi Anda peran IAM berikut pada project:

  • Untuk membuat resource load balancer seperti TargetHTTPSProxy: Admin Load Balancer Compute (roles/compute.loadBalancerAdmin)
  • Untuk menggunakan resource Certificate Manager: Certificate Manager Owner (roles/certificatemanager.owner)
  • Untuk membuat komponen keamanan dan jaringan: Admin Jaringan Compute (roles/compute.networkAdmin) dan Admin Keamanan Compute (roles/compute.securityAdmin)
  • Untuk membuat project (opsional): Project Creator (roles/resourcemanager.projectCreator)

Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Membuat kunci dan sertifikat yang ditandatangani

Bagian ini menggunakan perintah openssl untuk membuat sertifikat root dan intermediate.

Gunakan perintah berikut untuk membuat root certificate dan intermediate certificate yang ditandatangani dengan kolom keyUsage dan extendedKeyUsage yang valid.

  1. Buat contoh file example.cnf dengan konfigurasi minimum yang diperlukan untuk membuat sertifikat penandatanganan yang valid. Anda dapat mengedit file ini jika ingin menetapkan kolom tambahan pada sertifikat ini.

    cat > example.cnf << EOF
    [req]
    distinguished_name = empty_distinguished_name
    [empty_distinguished_name]
    # Kept empty to allow setting via -subj command line arg.
    [ca_exts]
    basicConstraints=critical,CA:TRUE
    keyUsage=keyCertSign
    extendedKeyUsage=clientAuth
    EOF
    
  2. Buat root certificate.

    openssl req -x509 \
        -new -sha256 -newkey rsa:2048 -nodes \
        -days 3650 -subj '/CN=root' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout root.key -out root.cert
    
  3. Buat permintaan penandatanganan untuk intermediate certificate.

    openssl req \
        -new -sha256 -newkey rsa:2048 -nodes \
        -subj '/CN=int' \
        -config example.cnf \
        -extensions ca_exts \
        -keyout int.key -out int.req
    
  4. Buat intermediate certificate.

    openssl x509 -req \
        -CAkey root.key -CA root.cert \
        -set_serial 1 \
        -days 3650 \
        -extfile example.cnf \
        -extensions ca_exts \
        -in int.req -out int.cert
    

Membuat sertifikat yang diizinkan

Bagian ini menggunakan perintah openssl untuk membuat contoh sertifikat yang diizinkan.

Gunakan perintah berikut untuk membuat sertifikat yang diizinkan.

   openssl req -x509 \
       -new -sha256 -newkey rsa:2048 -nodes \
       -days 3650 -subj '/CN=localhost' \
       -keyout allowlisted.key -out allowlisted.cert

Memformat sertifikat

Untuk menyertakan sertifikat baru atau yang sudah ada dalam TrustStore, format sertifikat tersebut ke dalam satu baris dan simpan dalam variabel lingkungan, sehingga dapat dibaca dalam file YAML. Gunakan perintah berikut untuk memformat sertifikat dan menyimpannya dalam variabel lingkungan:

export ROOT_CERT=$(cat root.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')
export INTERMEDIATE_CERT=$(cat int.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

Untuk menyertakan sertifikat baru atau yang sudah ada dalam daftar yang diizinkan dalam konfigurasi kepercayaan, format sertifikat ke dalam satu baris dan simpan dalam variabel lingkungan, agar dapat dibaca ke dalam file YAML. Gunakan perintah berikut untuk memformat sertifikat yang diizinkan dan menyimpannya di variabel lingkungan:

export ALLOWLISTED_CERT=$(cat allowlisted.cert | sed 's/^[ ]*//g' | tr '\n' $ | sed 's/\$/\\n/g')

Membuat resource TrustConfig

Buat resource TrustConfig Pengelola Sertifikat yang mewakili IKP Anda. Contoh resource TrustConfig ini berisi penyimpanan kepercayaan dengan dua trust anchor dan dua sertifikat CA perantara. Alat ini membaca konten sertifikat dari variabel lingkungan yang dibuat pada langkah Memformat sertifikat sebelumnya.

Untuk membuat penyimpanan trust dengan sertifikat trust anchor atau sertifikat CA perantara tambahan, tambahkan baris pemCertificate di bagian yang sesuai. Jika Anda memiliki lebih sedikit trust anchor atau sertifikat intermediate CA, hapus baris yang tidak diperlukan.

Contoh resource TrustConfig ini berisi sertifikat yang diizinkan. Anda dapat menentukan beberapa sertifikat yang diizinkan menggunakan beberapa instance kolom pemCertificate.

Pada langkah-langkah berikut, ganti TRUST_CONFIG_NAME dengan nama resource TrustConfig:

  1. Untuk membuat file trust_config.yaml dengan trust store, gunakan perintah berikut:

    cat << EOF > trust_config.yaml
    trustStores:
    - trustAnchors:
      - pemCertificate: "${ROOT_CERT?}"
      - pemCertificate: "${ROOT_CERT_2?}"
      intermediateCas:
      - pemCertificate: "${INTERMEDIATE_CERT?}"
      - pemCertificate: "${INTERMEDIATE_CERT_2?}"
    EOF
    
  2. Opsional: Untuk membuat file trust_config.yaml dengan sertifikat yang diizinkan, gunakan perintah berikut:

    cat << EOF > trust_config.yaml
     allowlistedCertificates:
     - pemCertificate: "${ALLOWLISTED_CERT?}"
    EOF
    
  3. Untuk membuat resource TrustConfig Pengelola Sertifikat, gunakan perintah gcloud certificate-manager trust-configs import:

    global

    Untuk Load Balancer Aplikasi eksternal dan Load Balancer Aplikasi internal lintas region, gunakan perintah ini:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml
    

    regional

    Untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional, gunakan perintah ini:

    gcloud certificate-manager trust-configs import TRUST_CONFIG_NAME  \
       --source=trust_config.yaml \
       --location=REGION
    

Membuat resource keamanan jaringan

Kebijakan TLS server (resource keamanan jaringan ServerTLSPolicy) memungkinkan Anda menentukan mode TLS sisi server dan resource TrustConfig yang akan digunakan saat memvalidasi sertifikat klien. Jika klien menyajikan sertifikat yang tidak valid atau tidak ada sertifikat ke load balancer, clientValidationMode akan menentukan cara penanganan koneksi klien.

  • Jika clientValidationMode disetel ke ALLOW_INVALID_OR_MISSING_CLIENT_CERT, semua permintaan akan diteruskan ke backend meskipun validasi gagal atau sertifikat klien tidak ada.
  • Jika clientValidationMode disetel ke REJECT_INVALID, hanya permintaan yang menyediakan sertifikat klien yang dapat divalidasi terhadap resource TrustConfig yang akan diteruskan ke backend.

Untuk membuat resource ServerTLSPolicy, selesaikan langkah-langkah berikut:

  1. Berdasarkan cara Anda ingin menangani koneksi, pilih salah satu opsi berikut.

    Pada langkah-langkah berikut, ganti SERVER_TLS_POLICY_NAME dengan nama kebijakan TLS server, lalu ganti PROJECT_ID dengan ID project Google Cloud Anda.

    • Opsi 1: clientValidationMode ditetapkan ke ALLOW_INVALID_OR_MISSING_CLIENT_CERT.

      Untuk membuat file server_tls_policy.yaml, gunakan perintah berikut:

      global

      Untuk Load Balancer Aplikasi eksternal dan Load Balancer Aplikasi internal lintas region, gunakan perintah:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regional

      Untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional, gunakan perintah:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: ALLOW_INVALID_OR_MISSING_CLIENT_CERT
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
    • Opsi 2: clientValidationMode disetel ke REJECT_INVALID.

      Untuk membuat file server_tls_policy.yaml, gunakan perintah berikut:

      global

      Untuk Load Balancer Aplikasi eksternal dan Load Balancer Aplikasi internal lintas region, gunakan perintah:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/global/trustConfigs/TRUST_CONFIG_NAME
      EOF
      

      regional

      Untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional, gunakan perintah:

      cat << EOF > server_tls_policy.yaml
      name: SERVER_TLS_POLICY_NAME
      mtlsPolicy:
        clientValidationMode: REJECT_INVALID
        clientValidationTrustConfig: projects/PROJECT_ID/locations/REGION/trustConfigs/TRUST_CONFIG_NAME
      EOF
      
  2. Untuk membuat resource ServerTlsPolicy, gunakan perintah gcloud network-security server-tls-policies import:

    global

    Untuk Load Balancer Aplikasi eksternal dan Load Balancer Aplikasi internal lintas region, gunakan perintah:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=global
    

    regional

    Untuk Load Balancer Aplikasi eksternal regional dan Load Balancer Aplikasi internal regional, gunakan perintah:

    gcloud network-security server-tls-policies import SERVER_TLS_POLICY_NAME \
      --source=server_tls_policy.yaml \
      --location=REGION
    

Untuk mengetahui informasi selengkapnya, lihat Mode validasi klien MTLS.

Menandatangani kunci klien dengan intermediate certificate

Bagian ini memberikan opsi konfigurasi tambahan untuk membuat leaf certificate. Jika Anda telah membuat resource TrustConfig menggunakan sertifikat perantara (int.cert dan int.key), gunakan petunjuk berikut:

  1. Membuat file konfigurasi kunci klien.

    cat > client.config << EOF
    [req]
    default_bits              = 2048
    req_extensions            = extension_requirements
    distinguished_name        = dn_requirements
    prompt                    = no
    
    [extension_requirements]
    basicConstraints          = critical, CA:FALSE
    keyUsage                  = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage          = clientAuth
    
    [dn_requirements]
    countryName               = US
    stateOrProvinceName       = California
    localityName              = San Francisco
    0.organizationName        = example
    organizationalUnitName    = test
    commonName                = test.example.com
    emailAddress              = test@example.com
    
    EOF
    

    Jika Anda ingin melampirkan identitas SPIFFE:

    • Tambahkan subjectAltName ke bagian [extension_requirements] sebagai berikut:

      subjectAltName            = @sans_list
      
    • Tambahkan bagian baru di bagian bawah file client.config dengan hal berikut:

      [sans_list]
      URI.1                     = spiffe://example.com/test-identity
      
  2. Tanda tangani kunci.

    openssl req -new -keyout client.key -out client.csr -config client.config
    
    openssl x509 -req -in client.csr -out client.cert -extfile client.config -extensions extension_requirements -days 365 -CA int.cert -CAkey int.key
    
  3. Untuk menguji, kirim permintaan curl ke alamat IP load balancer.

    curl -v -k --key client.key --cert client.cert https://IP_ADDRESS
    

    Ganti IP_ADDRESS dengan alamat IP load balancer.

Langkah selanjutnya