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
- Menyiapkan root CA, sertifikat server, dan sertifikat client
- Setting server Express yang melakukan validasi sertifikat client
- 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:
| CN | Aplikasi | Expired | Diterima Server? |
|---|---|---|---|
| payroll-app | Payroll System | 2025-01-01 | ✔️ Ya |
| finance-app | Finance Dashboard | 2023-12-01 | ❌ Tidak |
| ext-user | Eksternal Vendor | 2025-05-20 | ✔️ Ya |
| unknown-user | Tidak terdaftar | 2025-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
Gunakan CA yang terpercaya dan kelola distribusinya secara aman.
Hindari CA self-signed untuk sistem yang besar.Automatisasi rotasi & revocation certificate.
Implementasikan sistem untuk memperbaharui/menonaktifkan client certificate yang sudah expired/revoke.Logging terstruktur terhadap semua aktivitas handshake.
Termasuk siapa yang gagal dan alasannya.Verifikasi extension dan attribut sertifikat sesuai kebijakan organisasi.
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