Kegagalan validasi sertifikat TLS pada sistem operasi Linux sering kali memutus komunikasi antar-layanan melalui galat seperti SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED atau curl: (60) SSL certificate problem: unable to get local issuer certificate. Masalah ini umumnya berakar dari tiga hal: server target tidak mengirimkan rantai sertifikat lengkap (missing intermediate CA), sistem trust store lokal tidak memiliki root CA yang valid, atau format sertifikat pada trust store rusak.
Mendiagnosis Handshake Failure dengan OpenSSL dan cURL
Langkah pertama dalam isolasi masalah adalah menguji handshake TLS langsung ke endpoint menggunakan utilitas baris perintah standar. Pendekatan ini memisahkan apakah masalah berada pada level jaringan, konfigurasi server, atau trust store klien.
1. Tracing Handshake Menggunakan cURL
Jalankan curl dengan flag --verbose (-v) atau --trace-ascii untuk melihat detail negosiasi TLS dan titik kegagalan:
curl -vI https://api.internal.domain:8443Perhatikan output baris CAfile: /etc/ssl/certs/ca-certificates.crt. Nilai ini menunjukkan path trust anchor yang dipakai cURL. Jika proses gagal tepat setelah pertukaran cipher, perhatikan kode galat SSL yang dimuntahkan.
2. Memeriksa Certificate Chain Menggunakan openssl s_client
Gunakan openssl s_client dengan ekstensi Server Name Indication (SNI) aktif melalui argumen -servername:
openssl s_client -connect api.internal.domain:8443 -servername api.internal.domain -showcerts < /dev/nullCermati bagian Certificate chain dan Verify return code:
Certificate chain
0 s:CN = api.internal.domain
i:CN = Intermediate CA Alpha
1 s:CN = Intermediate CA Alpha
i:CN = Root CA Alpha
---
Verify return code: 0 (ok)Jika verifikasi menghasilkan kode berikut:
Verify return code: 21 (unable to verify the first certificate)Artinya server target hanya mengirimkan leaf (server) certificate tanpa menyertakan Intermediate CA, sementara klien Linux tidak menyimpan Intermediate CA tersebut di local trust store.
Menangani Masalah Missing Intermediate CA
Browser modern dapat memulihkan rantai sertifikat yang terputus melalui Authority Information Access (AIA) fetching. Namun, library TLS di Linux seperti OpenSSL dan GnuTLS secara default tidak melakukan AIA fetching demi efisiensi dan keamanan. Server wajib mengirimkan full chain (leaf certificate digabung dengan semua intermediate CA secara berurutan).
Solusi di Sisi Server (Nginx / HAProxy)
Gabungkan leaf certificate dengan intermediate certificate menjadi satu berkas bundle PEM. Pastikan urutannya benar:
- Leaf/Server Certificate
- Intermediate CA Certificate(s)
cat server.crt intermediate.crt > /etc/ssl/bundle.crtKonfigurasikan web server untuk menggunakan berkas bundle tersebut:
# Nginx
ssl_certificate /etc/ssl/bundle.crt;
ssl_certificate_key /etc/ssl/server.key;Struktur Trust Store Linux dan Penelusuran Trust Anchor
Di distribusi berbasis Debian/Ubuntu, sistem trust store terpusat di direktori berikut:
/etc/ssl/certs/: Direktori symlink hash sertifikat dan berkas gabunganca-certificates.crt./usr/share/ca-certificates/: Root CA bawaan sistem dari paketca-certificates./usr/local/share/ca-certificates/: Tempat meletakkan root CA kustom, internal, atau private PKI organisasi.
Pada distribusi RHEL/CentOS/Fedora, direktori padanannya adalah /etc/pki/ca-trust/source/anchors/ dengan perintah pembaruan update-ca-trust extract.
Menambahkan Root CA Kustom Secara Aman
Jika server internal menggunakan sertifikat yang diterbitkan oleh private enterprise CA, Root CA tersebut wajib didaftarkan ke trust store lokal OS klien. Hindari memodifikasi /etc/ssl/certs/ca-certificates.crt secara manual karena berkas ini akan ditimpa ulang secara otomatis saat update paket sistem.
Prosedur Debian / Ubuntu
Pastikan sertifikat berformat PEM (ASCII Base64) dan memiliki ekstensi .crt:
# 1. Konversi format DER/CER ke PEM jika diperlukan
openssl x509 -inform DER -in company_root.cer -out company_root.crt
# 2. Salin ke direktori trust store lokal
sudo cp company_root.crt /usr/local/share/ca-certificates/
# 3. Sinkronisasi trust store sistem
sudo update-ca-certificatesOutput sukses:
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.Verifikasi Hash dan Symlink Trust Anchor
Utilitas OpenSSL memvalidasi sertifikat against trust directory menggunakan hash subjek (subject hash). update-ca-certificates otomatis menjalankan c_rehash untuk membuat symlink bernama <hash>.0 di /etc/ssl/certs/.
Untuk memverifikasi kecocokan sertifikat terhadap trust store sistem secara manual:
# Hitung subject hash dari sertifikat root
openssl x509 -noout -hash -in /usr/local/share/ca-certificates/company_root.crt
# Cocokkan keberadaan symlink di /etc/ssl/certs/
ls -l /etc/ssl/certs/ | grep <hash_output>Jika symlink mengarah tepat ke berkas CA Anda, library OpenSSL dan aplikasi berbasis sistem trust store (Python, Go, cURL, Git) akan memvalidasi handshake TLS tanpa kendala.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!