Autentikasi TLS bersama

Biasanya pada komunikasi HTTPS, autentikasi hanya berfungsi dengan satu cara: klien memverifikasi identitas server.

Untuk aplikasi yang mengharuskan load balancer untuk mengautentikasi identitas klien yang terhubung ke aplikasi tersebut, gunakan TLS bersama (mTLS).

Dengan mTLS, load balancer meminta klien untuk mengirimkan sertifikat untuk mengautentikasi dirinya sendiri selama handshake TLS dengan load balancer. Anda dapat mengonfigurasi penyimpanan kepercayaan yang digunakan load balancer untuk memvalidasi rantai kepercayaan sertifikat klien.

Load Balancer Aplikasi berikut mendukung mTLS:

  • Load Balancer Aplikasi eksternal global
  • Load Balancer Aplikasi Klasik
  • Load Balancer Aplikasi eksternal regional (Pratinjau)
  • Load Balancer Aplikasi internal regional (Pratinjau)
  • Load Balancer Aplikasi internal lintas region

Arsitektur

Resource berikut diperlukan agar load balancer mendukung deployment autentikasi mTLS:

  • Resource kebijakan TLS server (ServerTLSPolicy). Memungkinkan Anda menentukan mode TLS sisi server dan resource TrustConfig yang akan digunakan saat memvalidasi sertifikat klien. Kebijakan TLS server mendukung autentikasi mTLS. Kebijakan TLS server dapat ditambahkan ke resource proxy HTTPS target.

  • Resource TrustConfig. Resource Certificate Manager. TrustConfig berisi resource single trust store yang digunakan untuk memvalidasi sertifikat klien. Untuk mengetahui informasi selengkapnya, lihat Mengelola konfigurasi kepercayaan.

    Anda dapat mengupload sertifikat yang diizinkan ke TrustConfig. Sertifikat yang diizinkan selalu dianggap valid selama sertifikat dapat diurai, bukti kepemilikan kunci pribadi dibuat, dan batasan di kolom SAN sertifikat terpenuhi. Sertifikat yang habis masa berlakunya juga dianggap valid jika diizinkan.

  • Trust store. Berisi sertifikat trust anchor dan intermediate certificate authority (CA) yang digunakan untuk memvalidasi rantai sertifikat klien. CA digunakan untuk menerbitkan sertifikat tepercaya bagi klien. CA diidentifikasi oleh root certificate trust anchor load balancer atau sertifikat CA perantara.

    Anda dapat mengupload jenis sertifikat klien berikut ke trust store:

Gambar berikut menampilkan komponen mTLS:

global

Diagram berikut menunjukkan komponen deployment Load Balancer Aplikasi eksternal. Arsitektur ini juga berlaku untuk Load Balancer Aplikasi internal lintas region, yang merupakan Load Balancer Aplikasi internal yang menggunakan komponen global.

TLS bersama dengan komponen Load Balancer Aplikasi eksternal global.
Gambar 1. TLS bersama dengan komponen Load Balancer Aplikasi eksternal global (klik untuk memperbesar).

regional

Diagram berikut menunjukkan komponen deployment Load Balancer Aplikasi internal regional. Arsitektur ini juga berlaku untuk Load Balancer Aplikasi eksternal regional, yang merupakan Load Balancer Aplikasi eksternal yang menggunakan komponen regional.

TLS bersama dengan komponen Load Balancer Aplikasi internal regional.
Gambar 1. TLS bersama dengan komponen Load Balancer Aplikasi internal regional (klik untuk memperbesar).

Untuk mengetahui informasi selengkapnya tentang komponen deployment Load Balancer Aplikasi, lihat bagian berikut:

Fitur

Fitur yang didukung oleh mTLS untuk load balancer memungkinkan Anda melakukan hal berikut:

  • Memverifikasi bukti kepemilikan kunci pribadi sertifikat yang diberikan oleh klien.

  • Validasi sertifikat klien dalam salah satu dari dua mode berikut:

    • Menolak permintaan jika kami tidak dapat memvalidasi rantai sertifikat klien terhadap penyimpanan trust.
    • Teruskan semua permintaan ke backend meskipun tidak memberikan sertifikat klien.
  • Lakukan validasi sertifikat klien terhadap anchor IKP yang diupload. Mendukung penambahan beberapa anchor IKP secara terpisah untuk memfasilitasi migrasi tanpa periode nonaktif dari IKP lama ke IKP baru.

  • Memberikan intermediate certificate tambahan yang akan digunakan untuk membuat jalur validasi terhadap anchor IKP yang ditentukan. Sertifikat perantara memungkinkan Anda menggunakan mTLS dengan klien yang tidak meneruskan rantai sertifikat lengkap.

  • Buat dan teruskan sidik jari sertifikat ke backend sebagai header permintaan kustom.

  • Teruskan kolom yang dipilih yang diekstrak dari sertifikat ke backend menggunakan header permintaan kustom.

  • Teruskan hasil validasi dan error validasi ke backend dengan menggunakan header permintaan kustom.

Untuk deskripsi yang lebih mendetail tentang proses validasi, lihat bagian Langkah-langkah validasi sertifikat klien nanti di halaman ini.

Mode validasi klien MTLS

Jika klien memberikan sertifikat yang tidak valid atau tidak ada sertifikat ke load balancer, clientValidationMode akan menentukan cara penanganan koneksi klien.

Nilai clientValidationMode adalah sebagai berikut:

  • ALLOW_INVALID_OR_MISSING_CLIENT_CERT mengizinkan koneksi dari klien meskipun validasi rantai sertifikat sertifikat klien gagal atau tidak ada sertifikat klien yang diberikan. Bukti kepemilikan kunci pribadi selalu diperiksa ketika sertifikat klien diberikan.

    Anda dapat menggunakan variabel header kustom dengan mode ini untuk menunjukkan kepada backend apakah klien memberikan sertifikat, apakah validasi sertifikat berhasil, dan informasi lain yang diekstrak dari sertifikat.

  • REJECT_INVALID menolak koneksi jika klien tidak memberikan sertifikat atau jika validasi sertifikat gagal.

Anda dapat melihat log untuk validasi sertifikat klien mTLS saat logging diaktifkan di layanan backend.

Nilai header kustom yang diteruskan ke backend

Tabel berikut menampilkan semua nilai variabel header kustom TLS bersama yang selalu diteruskan ke backend (jenis permintaan "Pass request to backend"). Header kustom diteruskan ke backend saat clientValidationMode ditetapkan ke ALLOW_INVALID_OR_MISSING_CLIENT_CERT atau sertifikat klien lulus validasi sertifikat.

Status sertifikat klien clientValidationMode Header kustom

Rantai sertifikat klien terlalu panjang (lebih dari 10 intermediate certificate disertakan dengan sertifikat klien).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_exceeded_limit

client_cert_sha256_fingerprint: <cert hash>

Ukuran kunci RSA atau sertifikat perantara tidak valid.

Tidak ada validasi yang dilakukan.

Kunci RSA dapat berukuran 2048 hingga 4096 bit.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_invalid_rsa_key_size

client_cert_sha256_fingerprint: <cert hash>

Klien atau sertifikat perantara menggunakan kurva eliptis yang tidak didukung.

Tidak ada validasi yang dilakukan.

Kurva eliptis yang valid adalah P-256 dan P-384.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_elliptic_curve_key

client_cert_sha256_fingerprint: <cert hash>

Klien atau sertifikat perantara menggunakan algoritma non-RSA non-ECDSA.

Tidak ada validasi yang dilakukan.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_key_algorithm

client_cert_sha256_fingerprint: <cert hash>

IKP yang akan digunakan untuk validasi memiliki lebih dari sepuluh sertifikat perantara yang memiliki Info Kunci Publik Subjek dan Subjek yang sama.

Tidak ada validasi yang dilakukan.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_pki_too_large

client_cert_sha256_fingerprint: <cert hash>

Sertifikat perantara yang disediakan untuk validasi memiliki lebih dari 10 batasan nama.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_max_name_constraints_exceeded

client_cert_sha256_fingerprint: <cert hash>

Sertifikat klien atau penerbitnya tidak memiliki Extended Key Usage (EKU) yang menyertakan clientAuth

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_invalid_eku

client_cert_sha256_fingerprint: <cert hash>

Batas waktu akan terlampaui saat mencoba memvalidasi rantai sertifikat. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_timed_out

client_cert_sha256_fingerprint: <cert hash>

Batas kedalaman atau iterasi tercapai saat mencoba memvalidasi rantai sertifikat.

Kedalaman maksimum untuk rantai sertifikat adalah sepuluh, termasuk sertifikat root dan klien. Iterasi maksimumnya adalah 100 (sertifikat yang diperiksa untuk memvalidasi rantai sertifikat klien).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_search_limit_exceeded

client_cert_sha256_fingerprint: <cert hash>

Anda telah mengonfigurasi mTLS tanpa menyiapkan resource TrustConfig.

Tidak ada validasi yang dapat dilakukan, tetapi hash sertifikat diteruskan ke backend.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_not_performed

client_cert_sha256_fingerprint: <cert hash>

Tidak ada sertifikat klien. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: false

client_cert_chain_verified: false

client_cert_error: client_cert_not_provided

client_cert_sha256_fingerprint: <empty>

Sertifikat klien gagal divalidasi terhadap resource TrustConfig. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_failed

client_cert_sha256_fingerprint: <cert hash>

Sertifikat klien lulus validasi pemverifikasi sertifikat. Tidak berlaku

client_cert_present: true

client_cert_chain_verified: true

client_cert_error: <empty>

client_cert_sha256_fingerprint: <cert hash>

client_cert_serial_number: <serial_number>

client_cert_valid_not_before: <date>

client_cert_valid_not_after: <date>

client_cert_uri_sans: <list>

client_cert_dnsname_sans: <list>

client_cert_issuer_dn: <issuer>

client_cert_subject_dn: <subject>

client_cert_leaf: <certificate>

client_cert_chain: <list>

Mencatat error untuk koneksi yang ditutup

Error berikut menyebabkan koneksi klien ditutup jika clientValidationMode ditetapkan ke ALLOW_INVALID_OR_MISSING_CLIENT_CERT atau REJECT_INVALID. Untuk mengetahui informasi selengkapnya, lihat Pesan kegagalan HTTP statusDetails. Error ini dicatat dalam log ke Cloud Logging dan dijelaskan dalam tabel berikut.

Status sertifikat klien Permintaan Kesalahan yang dicatat
Sertifikat klien menggagalkan kecocokan tanda tangan selama handshake. Menghentikan handshake SSL Tidak ada
Layanan tidak dapat menjalankan validasi rantai sertifikat. Putuskan koneksi client_cert_validation_unavailable
Terjadi error internal saat memvalidasi rantai sertifikat. Putuskan koneksi client_cert_validation_internal_error
TrustConfig yang cocok tidak ditemukan. Putuskan koneksi client_cert_trust_config_not_found
Payload sertifikat klien (termasuk intermediate certificate) terlalu besar (lebih dari 16 KB). Putuskan koneksi client_cert_exceeded_size_limit

Error yang dicatat dengan validasi REJECT_INVALID

Error berikut mengakibatkan koneksi tertutup (jenis permintaan "Hentikan koneksi") saat clientValidationMode ditetapkan ke REJECT_INVALID. Untuk mengetahui informasi selengkapnya, lihat pesan kegagalan HTTP statusDetails. Error ini dicatat dalam log ke Cloud Logging dan dijelaskan dalam tabel berikut.

Status sertifikat klien Kesalahan yang dicatat
Rantai sertifikat klien terlalu panjang (lebih dari 10 sertifikat perantara disertakan dengan sertifikat klien). client_cert_chain_exceeded_limit

Ukuran kunci RSA atau sertifikat perantara tidak valid.

Tidak ada validasi yang dilakukan.

Kunci RSA dapat berukuran 2048 hingga 4096 bit.

client_cert_invalid_rsa_key_size

Klien atau sertifikat perantara menggunakan kurva eliptis yang tidak didukung.

Tidak ada validasi yang dilakukan.

Kurva yang valid adalah P-256 dan P-384.

client_cert_unsupported_elliptic_curve_key

Klien atau sertifikat perantara menggunakan algoritma non-RSA atau non-ECDSA.

Tidak ada validasi yang dilakukan.

client_cert_unsupported_key_algorithm

IKP yang akan digunakan untuk validasi memiliki lebih dari sepuluh sertifikat perantara yang memiliki Info Kunci Publik Subjek dan Subjek yang sama.

Tidak ada validasi yang dilakukan.

client_cert_pki_too_large

Sertifikat perantara yang disediakan untuk validasi memiliki lebih dari 10 batasan nama.

client_cert_chain_max_name_constraints_exceeded

Sertifikat klien atau penerbitnya tidak memiliki Extended Key Usage (EKU) yang menyertakan clientAuth

client_cert_chain_invalid_eku

Batas waktu akan terlampaui saat mencoba memvalidasi rantai sertifikat. client_cert_validation_timed_out

Batas kedalaman atau iterasi tercapai saat mencoba memvalidasi rantai sertifikat.

Kedalaman maksimum untuk rantai sertifikat adalah sepuluh, termasuk sertifikat root dan klien. Jumlah maksimum iterasi adalah 100 (sertifikat yang diperiksa untuk memvalidasi rantai sertifikat klien).

client_cert_validation_search_limit_exceeded
Anda telah mengonfigurasi mTLS tanpa menyiapkan resource TrustConfig. client_cert_validation_not_performed
Klien tidak memberikan sertifikat yang diminta selama handshake. client_cert_not_provided
Sertifikat klien gagal divalidasi dengan resource TrustConfig. client_cert_validation_failed

Langkah-langkah validasi sertifikat klien

Saat memvalidasi sertifikat klien, load balancer melakukan langkah-langkah berikut:

  1. Load balancer memverifikasi tanda tangan klien untuk membuktikan bahwa klien memiliki kunci pribadi sertifikat klien. Jika langkah ini gagal, load balancer akan selalu menggagalkan handshake TLS, meskipun konfigurasi Anda memungkinkan sertifikat klien yang tidak valid atau hilang, dan tidak ada informasi yang dicatat dalam log.
  2. Jika konfigurasi menyertakan TrustAnchor, load balancer akan memverifikasi rantai kepercayaan antara sertifikat klien dan TrustAnchor yang dikonfigurasi. Secara khusus, load balancer memverifikasi hal berikut:
    • Klien, intermediate, dan root certificate mematuhi persyaratan sertifikat.
    • Kolom subjek di sertifikat induk cocok dengan kolom masalah di sertifikat turunan.
    • ID Kunci Subjek (SKID) dari sertifikat induk cocok dengan ID Kunci Otoritas (AKID) dalam sertifikat turunan.
    • SAN sertifikat turunan tidak melanggar kolom NameConstraints di sertifikat induk.
  3. Jika verifikasi rantai kepercayaan berhasil, permintaan akan diteruskan ke backend dengan header kustom mTLS yang dikonfigurasi untuk endpoint.
  4. Jika verifikasi rantai kepercayaan gagal:
    • Jika ClientValidationMode ditetapkan ke REJECT_INVALID, load balancer akan menghentikan koneksi dan mencatat alasan ke Cloud Logging.
    • Jika ClientValidationMode disetel ke ALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE, load balancer tetap akan meneruskan permintaan ke backend. Anda dapat menggunakan header permintaan kustom untuk menunjukkan kepada backend bahwa validasi gagal, dan alasan kegagalannya. Untuk Load Balancer Aplikasi internal lintas region, Load Balancer Aplikasi eksternal regional, atau Load Balancer Aplikasi internal regional, selain header permintaan kustom, Anda dapat mengonfigurasi kolom opsional mTLS untuk memeriksa alasan kegagalan.

Persyaratan sertifikat

  • Sertifikat harus menggunakan cipher RSA atau ECDSA.
  • Untuk sertifikat klien (leaf):
  • Untuk root certificate dan intermediate certificate:
    • Ekstensi Basic Constraints harus berisi CA=true.
    • Ekstensi Key Usage harus ditetapkan ke keyCertSign.
    • Ekstensi Extended Key Usage harus berisi kolom clientAuth. Hal ini diperlukan untuk sertifikat yang menerbitkan sertifikat klien.
    • Sertifikat harus masih berlaku.

Batasan

  • Load balancer tidak melakukan pemeriksaan pembatalan pada sertifikat klien.

  • Load Balancer Aplikasi memungkinkan Anda mengupload konfigurasi kepercayaan dengan satu penyimpanan trust yang berisi maksimal 100 trust anchor dan 100 intermediate certificate serta 500 sertifikat yang diizinkan. Semua intermediate certificate tidak boleh memiliki lebih dari tiga sertifikat yang memiliki info Kunci Publik Subjek dan Subjek yang sama. Untuk informasi lebih lanjut, lihat Kuota dan batas.

  • Kedalaman maksimum untuk rantai sertifikat adalah sepuluh, termasuk sertifikat root dan klien. Frekuensi maksimum sertifikat perantara dapat dievaluasi saat mencoba membuat rantai kepercayaan adalah 100. Untuk mengetahui informasi selengkapnya, lihat Kuota dan batas.

  • Kunci sertifikat yang diupload dan diteruskan dari klien dibatasi untuk hal berikut:

    • Kunci RSA dapat berukuran 2048 hingga 4096 bit. Untuk mengetahui informasi selengkapnya, lihat Kuota dan batas.
    • Kunci ECDSA dapat menggunakan kurva P-256 atau P-384.
  • Rantai sertifikat yang diterima yang diterima dari klien dibatasi hingga 16 KB dan 10 sertifikat. Untuk mengetahui informasi selengkapnya, lihat Kuota dan batas.

  • Root certificate yang digunakan untuk validasi tidak boleh berisi lebih dari 10 batasan nama. Untuk mengetahui informasi selengkapnya, lihat Kuota dan batas.

  • Sertifikat klien yang ditandatangani sendiri selalu dianggap tidak valid oleh load balancer.

Langkah selanjutnya