Tanpa TLS, setiap byte yang berjalan antara aplikasi dan MongoDB — query, hasil query, sampai password yang Anda kirim saat createUser — bergerak sebagai teks polos yang bisa dibaca pihak penyadap jaringan. Encryption in transit menutup celah itu: klien dan server berjabat tangan lewat protokol TLS, menyepakati kunci, lalu seluruh percakapan berikutnya terenkripsi. Chapter ini menjalankan lab TLS sungguhan: satu server mongod sementara dengan sertifikat self-signed di port 28018, lalu kita buktikan tiga skenario koneksi — ditolak, tidak dipercaya, dan berhasil.
Peta materi Chapter ini:
- Empat mode TLS pada
net.tls.modedan strategi migrasinya. - Membuat sertifikat self-signed dengan
openssldan mengaktifkan TLS di konfigurasi. - Tiga skenario koneksi nyata: tanpa TLS, TLS tanpa
tlsCAFile, dan TLS lengkap. - Perbedaan sertifikat self-signed dan CA, serta TLS di MongoDB Atlas.
Empat Mode TLS #
TLS dikendalikan oleh net.tls.mode di file konfigurasi. Empat nilainya membentuk tangga migrasi:
| Mode | Koneksi masuk | Keterangan |
|---|---|---|
disabled | Hanya non-TLS | TLS mati total — keadaan server latihan kita |
allowTLS | Non-TLS dan TLS | Transisi; umumnya untuk anggota cluster lawas |
preferTLS | Non-TLS dan TLS | Koneksi antar-server memakai TLS |
requireTLS | Hanya TLS | Klien non-TLS ditolak sejak jabat tangan |
Untuk server baru, langsung gunakan requireTLS. Untuk cluster hidup yang klien-nya belum siap, naik bertahap: preferTLS lebih dulu, lalu requireTLS setelah semua klien bermigrasi — strategi resmi yang dianjurkan dokumentasi MongoDB.
Menyiapkan Sertifikat Self-Signed #
Lab ini berjalan sepenuhnya di mesin lokal dan tidak menyentuh server bersama kita. Kita butuh tiga berkas: kunci privat, sertifikat, dan gabungan keduanya (format PEM yang dibaca certificateKeyFile). Perintah openssl berikut membuat semuanya:
openssl req -newkey rsa:2048 -nodes -keyout kunci-server.pem -out server.csr \
-subj "/CN=localhost/O=Latihan MongoDB/C=ID"
openssl x509 -req -in server.csr -signkey kunci-server.pem -days 365 -out sert-server.pem \
-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1")
cat sert-server.pem kunci-server.pem > bundle-server.pemOutput yang Dihasilkan (baris progress pembuatan kunci dihilangkan):
Certificate request self-signature ok
subject=CN=localhost, O=Latihan MongoDB, C=IDOpsi -extfile yang memuat subjectAltName bukan hiasan — tanpa field SAN, klien modern menolak mencocokkan alamat meskipun CN sudah benar. Kita periksa hasilnya:
openssl x509 -in sert-server.pem -noout -subject -ext subjectAltNameOutput yang Dihasilkan:
subject=CN=localhost, O=Latihan MongoDB, C=ID
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:127.0.0.1Menyalakan requireTLS #
Berikut konfigurasi lengkap server lab (simpan sebagai mongod-tls.conf, jalankan dengan mongod --config mongod-tls.conf):
net:
bindIp: 127.0.0.1
port: 28018
tls:
mode: requireTLS
certificateKeyFile: /tmp/tls-lab/bundle-server.pem
CAFile: /tmp/tls-lab/sert-server.pem
allowConnectionsWithoutCertificates: true
storage:
dbPath: /tmp/tls-lab/data
systemLog:
destination: file
path: /tmp/tls-lab/mongod.log
logAppend: trueTiga baris di blok tls penting untuk dipahami:
certificateKeyFile: sertifikat dan kunci privat server dalam satu berkas PEM — identitas yang dipresentasikan kepada klien.CAFile: rantai kepercayaan. Sejak MongoDB 9.0, menjalankan TLS tanpa rantai kepercayaan tidak lagi diizinkan (galatThe use of TLS without specifying a chain of trust is no longer supported); sertifikat self-signed kita berperan sebagai CA-nya sendiri.allowConnectionsWithoutCertificates: true: secara default, server yang memilikiCAFilemenuntut setiap klien mempresentasikan sertifikat. Nilaitruemengizinkan klien SCRAM biasa — pola umum produksi saat Anda ingin enkripsi TLS tanpa authentication x.509.
Setelah server hidup, log-nya mengonfirmasi TLS aktif — perhatikan "ssl":"on":
"msg":"Waiting for connections","attr":{"port":28018,"ssl":"on"}Tiga Skenario Koneksi #
Skenario pertama: klien lama tanpa TLS. Server requireTLS menutup koneksi itu sejak awal:
mongosh "mongodb://127.0.0.1:28018/?directConnection=true" --quiet --eval 'db.adminCommand({ping: 1})'Output yang Dihasilkan:
MongoServerSelectionError: connection <monitor> to 127.0.0.1:28018 closedSkenario kedua: klien mengaktifkan tls=true tetapi tidak membawa CA apa pun. Jabat tangan TLS berjalan, lalu klien menolak sertifikat yang tidak dikenalnya:
mongosh "mongodb://127.0.0.1:28018/?directConnection=true&tls=true" --quiet --eval 'db.adminCommand({ping: 1})'Output yang Dihasilkan:
MongoNetworkError: self-signed certificate; if the root CA is installed locally, try running Node.js with --use-system-caSkenario ketiga: klien mempercayai sertifikat kita lewat parameter tlsCAFile — dan koneksi akhirnya berhasil:
mongosh "mongodb://127.0.0.1:28018/?directConnection=true&tls=true&tlsCAFile=/tmp/tls-lab/sert-server.pem" --quiet --eval 'db.adminCommand({ping: 1}).ok'Output yang Dihasilkan:
1Nilai 1 adalah ok: 1 dari ping — kini seluruh percakapan klien-server berjalan terenkripsi. Parameternya juga berlaku di connection string aplikasi: mongodb://host:28018/?tls=true&tlsCAFile=/jalan/ke/ca.pem. Setelah selesai bereksperimen, matikan server lab Anda (proses mongod milik sendiri, bukan server bersama).
Memeriksa TLS dari Dalam mongosh #
Dua perintah ringkas memungkinkan kita memeriksa status TLS tanpa membuka file konfigurasi. Yang pertama membaca mode TLS yang sedang berjalan pada server yang kita hubungi:
db.adminCommand({ getParameter: 1, tlsMode: 1 })Output yang Dihasilkan (bagian $clusterTime dan operationTime diringkas):
{
tlsMode: 'disabled',
ok: 1
}Nilai disabled menegaskan koneksi kita ke server latihan memang tidak terenkripsi — sesuai desain latihan. Perintah kedua menanyakan library TLS yang dipakai mongod — informasi yang berguna saat audit versi:
db.adminCommand({ buildInfo: 1 }).opensslOutput yang Dihasilkan:
{
running: 'OpenSSL 3.5.7 9 Jun 2026',
compiled: 'OpenSSL 3.5.4 30 Sep 2025'
}Field running menunjukkan versi OpenSSL yang aktif di proses, sedangkan compiled versi saat mongod dibangun. Ketika kerentanan TLS dipublikasikan, dua angka inilah yang Anda bandingkan dengan imbauan keamanan.
Self-Signed, CA, dan Atlas #
Sertifikat self-signed cocok untuk lab dan jaringan tertutup, tetapi setiap klien harus diberi tlsCAFile secara eksplisit — persis galat skenario kedua di atas. Deployment produksi memakai sertifikat yang diterbitkan CA internal organisasi atau CA publik; klien sudah mempercayai root CA tersebut sehingga konfigurasi lebih ringkas, dan rotasi sertifikat kedaluwarsa menjadi prosedur terjadwal (server memberi peringatan 30 hari sebelum kedaluwarsa). Untuk authentication berbasis sertifikat klien (x.509), buang allowConnectionsWithoutCertificates — setiap klien wajib mempresentasikan sertifikat yang divalidasi terhadap CAFile, topik yang menyambung ke mekanisme x.509 di Chapter Authentication.
Di MongoDB Atlas, TLS selalu aktif untuk semua cluster — Anda tidak perlu (dan tidak bisa) mematikannya, cukup mengunduh sertifikat CA Atlas untuk koneksi aplikasi.
Rangkuman #
- Empat mode
net.tls.modemembentuk tangga migrasi; server baru langsungrequireTLS. - Sertifikat self-signed cukup untuk lab; sertakan
subjectAltName, gabungkan sertifikat dan kunci menjadi satu PEM untukcertificateKeyFile. - MongoDB 9.0 mewajibkan rantai kepercayaan (
CAFile); klien SCRAM tanpa sertifikat membutuhkanallowConnectionsWithoutCertificates: true. - Klien mengaktifkan TLS dengan
tls=truedan mempercayai server lewattlsCAFile; tanpa keduanya masing-masing gagal dengan galat berbeda. - Produksi memakai CA internal/publik dan memantau kedaluwarsa sertifikat; Atlas mengaktifkan TLS secara permanen.