tutorial

  1. Validasi Sertifikat Client di Server

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:

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

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

b. Buat sertifikat server

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

c. Buat sertifikat client

openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/CN=client"
openssl 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.

const fs = require('fs');
const https = require('https');
const express = require('express');

const app = express();

// Konfigurasi TLS dengan CA dan validasi client cert
const options = {
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.crt'),
  ca: fs.readFileSync('rootCA.pem'),
  requestCert: true,         // Wajibkan client kirim sertifikat
  rejectUnauthorized: true,  // Tolak jika tidak valid/CA tidak dikenal
};

app.get('/', (req, res) => {
  // req.client.authorized otomatis true jika sertifikat valid & trusted
  if (req.client.authorized) {
    res.send('Hello, Client dengan sertifikat valid!');
  } else {
    res.status(401).send('Akses ditolak: Sertifikat client tidak valid');
  }
});

https.createServer(options, app).listen(3443, () => {
  console.log('Server listen di https://localhost:3443');
});

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:
curl -v https://localhost:3443 \
  --cacert rootCA.pem \
  --cert client.crt \
  --key client.key

Respons server: Hello, Client dengan sertifikat valid!

  • Client request TANPA sertifikat:
curl -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

comments powered by Disqus