Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
03 Aug 2025 · 5 mnt baca ·Artikel 56 / 110
Go

56. Validasi Sertifikat Client di Server

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

56. Validasi Sertifikat Client di Server: Panduan Mendalam dengan Contoh Kode dan Diagram

Validasi sertifikat client di server adalah elemen fundamental dalam membangun sistem komunikasi yang aman berbasis TLS/SSL. Banyak engineer familiar dengan HTTPS dan sertifikat SSL untuk server—namun tidak sedikit yang belum menerapkan client authentication karena dianggap kompleks atau birokrasinya tinggi. Padahal, validasi sertifikat client memberikan lapisan proteksi tambahan yang sangat signifikan, khususnya pada sistem internal, API, atau komunikasi service-to-service (mTLS). Pada artikel ini kita akan mengupas tuntas validasi sertifikat client mulai dari konsep, alur, praktik implementasi (contoh kode), hingga simulasi uji coba agar Anda bisa langsung menerapkannya di proyek-proyek Anda.


Apa Itu Validasi Sertifikat Client?

Secara umum, saat membangun koneksi TLS, server menyajikan sertifikat kepada client untuk membuktikan identitasnya. Namun, dengan mutual TLS (mTLS), client juga harus menyajikan sertifikat kepada server. Server kemudian memvalidasi sertifikat client sebelum mengizinkan akses.

Validasi pada umumnya mencakup:

  • Issues (CA) yang terpercaya
  • Masa berlaku sertifikat (valid from & valid until)
  • Fitur/fingerprint sertifikat (misalnya, extension tertentu)
  • Revocation status (CRL/OCSP)

Manfaat langsungnya adalah:

  • Autentikasi dua arah: Bukan hanya server yang diverifikasi, tetapi client juga diverifikasi.
  • Derecognize unauthorized clients: Hanya client dengan sertifikat yang valid yang bisa mengakses server/API.
  • Lebih cocok untuk machine-to-machine communication: Misalnya antar microservice, IoT Gateway, dsb.

Diagram Alur: TLS handshake dengan Validasi Sertifikat Client

Sebelum masuk ke kode, mari lihat alur handshake yang terjadi menggunakan diagram mermaid berikut:

MERMAID
sequenceDiagram
    participant Client
    participant Server

    Client->>Server: Client Hello (cipher suite, etc)
    Server->>Client: Server Hello + Certificate
    Server->>Client: (Optional) Certificate Request
    Client->>Server: Client Certificate
    Client->>Server: Key Exchange
    Server->>Client: Server Finished
    Client->>Server: Client Finished

    Note over Server: Validasi Sertifikat Client 
(CA trust, Validity, Revocation)

Pada tahap Certificate Request, server meminta sertifikat dari client. Setelah mendapatkan, server melakukan validasi sebelum melanjutkan handshake.


Penerapan di Dunia Nyata: Simulasi dan Kode

Mari kita lakukan simulasi sederhana dengan web server berbasis Node.js menggunakan framework Express. Fokus kita pada

  1. Menyiapkan root CA, sertifikat server, dan sertifikat client
  2. Setting server Express yang melakukan validasi sertifikat client
  3. Simulasi client request menggunakan curl

1. Menyiapkan Sertifikat (dengan OpenSSL)

a. Buat root CA

bash
1openssl genrsa -out rootCA.key 2048
2openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem -subj "/CN=RootCA"

b. Buat sertifikat server

bash
1openssl genrsa -out server.key 2048
2openssl req -new -key server.key -out server.csr -subj "/CN=localhost"
3openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256

c. Buat sertifikat client

bash
1openssl genrsa -out client.key 2048
2openssl req -new -key client.key -out client.csr -subj "/CN=client"
3openssl x509 -req -in client.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out client.crt -days 500 -sha256

Akhirnya, kita akan punya file: rootCA.pem, server.crt, server.key, client.crt, client.key.


2. Konfigurasi Express dengan Validasi Sertifikat Client

Kode sederhana berikut memaksa client untuk mengirimkan sertifikat, dan server akan menolak request tanpa sertifikat/sertifikat tidak valid.

js
 1const fs = require('fs');
 2const https = require('https');
 3const express = require('express');
 4
 5const app = express();
 6
 7// Konfigurasi TLS dengan CA dan validasi client cert
 8const options = {
 9  key: fs.readFileSync('server.key'),
10  cert: fs.readFileSync('server.crt'),
11  ca: fs.readFileSync('rootCA.pem'),
12  requestCert: true,         // Wajibkan client kirim sertifikat
13  rejectUnauthorized: true,  // Tolak jika tidak valid/CA tidak dikenal
14};
15
16app.get('/', (req, res) => {
17  // req.client.authorized otomatis true jika sertifikat valid & trusted
18  if (req.client.authorized) {
19    res.send('Hello, Client dengan sertifikat valid!');
20  } else {
21    res.status(401).send('Akses ditolak: Sertifikat client tidak valid');
22  }
23});
24
25https.createServer(options, app).listen(3443, () => {
26  console.log('Server listen di https://localhost:3443');
27});

Server Express di atas hanya akan menerima request dari client dengan sertifikat yang valid dan ditandatangani oleh Root CA yang sama.


3. Simulasi Request Client

  • Client request dengan sertifikat valid:

bash
1curl -v https://localhost:3443 \
2  --cacert rootCA.pem \
3  --cert client.crt \
4  --key client.key
Respons server: Hello, Client dengan sertifikat valid!

  • Client request TANPA sertifikat:

bash
1curl -v https://localhost:3443 --cacert rootCA.pem
Respons server: Akses ditolak: Sertifikat client tidak valid


Studi Kasus: Tabel Skema Otorisasi Client

Misal, Anda mengelola layanan API payroll internal. Klien yang diperbolehkan adalah daftar tertentu yang sudah diberikan sertifikat masing-masing. Setiap sertifikat diberi Common Name (CN) sesuai nama aplikasi/instansi:

CNAplikasiExpiredDiterima Server?
payroll-appPayroll System2025-01-01✔️ Ya
finance-appFinance Dashboard2023-12-01❌ Tidak
ext-userEksternal Vendor2025-05-20✔️ Ya
unknown-userTidak terdaftar2025-06-30❌ Tidak

Validasi lanjut bisa dilakukan lewat field SAN (Subject Alternative Name) atau extension lain, misal untuk mengatur role/privilege.


Best Practice Validasi Sertifikat Client

  1. Gunakan CA yang terpercaya dan kelola distribusinya secara aman.
    Hindari CA self-signed untuk sistem yang besar.

  2. Automatisasi rotasi & revocation certificate.
    Implementasikan sistem untuk memperbaharui/menonaktifkan client certificate yang sudah expired/revoke.

  3. Logging terstruktur terhadap semua aktivitas handshake.
    Termasuk siapa yang gagal dan alasannya.

  4. Verifikasi extension dan attribut sertifikat sesuai kebijakan organisasi.

  5. Gunakan mutual TLS hanya untuk endpoint kritikal/intern
    karena implementasi di sisi client menambah kompleksitas.


Kesimpulan

Validasi sertifikat client pada server merupakan mekanisme keamanan kuat, terutama pada skenario komunikasi machine-to-machine yang membutuhkan autentikasi dua arah. Implementasinya memang membutuhkan sedikit upaya tambahan (sertifikat CA, distribusi client certificate, dsb), tetapi manfaatnya sepadan dengan tingkat keamanan yang didapat.

Pada dunia nyata, praktik seperti mutual TLS sudah menjadi best practice pada banyak financial API, Open Banking, dan service mesh (istio/linkerd). Semoga artikel dan contoh kode di atas membantu Anda memahami dan mulai menerapkan validasi sertifikat client di sistem Anda.

Terus semangat ngulik fitur security, karena defense in depth akan menyelamatkan Anda dari mimpi buruk cybersecurity!


Referensi lebih lanjut

Artikel Terkait

💬 Komentar