Langkah 1:Dapatkan MongoDB 3.0
Hal pertama yang perlu Anda ketahui adalah bahwa SSL hanya didukung langsung oleh MongoDB 3.0 dan yang lebih baru. Ubuntu tidak memiliki 3.0 di repositori default, jadi inilah cara Anda mendapatkannya:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org=3.0.7 mongodb-org-server=3.0.7 mongodb-org-shell=3.0.7 mongodb-org-mongos=3.0.7 mongodb-org-tools=3.0.7
3.0.7 adalah versi stabil terbaru saat ini, tetapi jangan ragu untuk mengganti 3.0.7 dengan rilis favorit Anda.
Langkah 2:Dapatkan Kunci Pribadi, Sertifikat, dan file PEM
PEM berisi Sertifikat Kunci Publik dan Kunci Pribadi terkait. File-file ini dapat diperoleh dengan dolar IRL dari Certificate Authroity atau dibuat dengan OpenSSL seperti:
openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
mongodb.pem akan digunakan sebagai file PEM, mongodb-cert.key adalah file Private Key, dan mongodb-cert.crt adalah file Sertifikat yang juga dapat digunakan sebagai file CA. ANDA MEMBUTUHKAN KETIGA INI.
Langkah 3:Konfigurasi MongoD
Kami akan berasumsi bahwa Anda menyalin file-file ini ke folder /etc/ssl/ Anda di mana mereka berada. Sekarang kita buka file konfigurasi MongoDB kita:
sudo vi /etc/mongod.conf
dan ubah bagian "# antarmuka jaringan" seperti ini:
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
ssl:
mode: allowSSL
PEMKeyFile: /etc/ssl/mongodb.pem
#CAFile: /etc/ssl/mongodb-cert.crt
HARAP DICATAT :kami mengomentari bindIp
. INI MENGIZINKAN KONEKSI EKSTERNAL untuk mengakses database Mongo Anda. Kami berasumsi bahwa ini adalah tujuan akhir Anda (Mengapa Anda mengenkripsi lalu lintas di localhost? ), tetapi Anda hanya boleh melakukan ini SETELAH MENYIAPKAN ATURAN OTORISASI untuk server MongoDB Anda.
CAFile juga dikomentari karena bersifat opsional. Saya akan menjelaskan cara mengatur kepercayaan Otoritas Sertifikat di akhir posting ini.
Seperti biasa, Anda harus me-restart MongoDB sebelum perubahan file konfigurasi akan berlaku:
sudo service mongod restart
APAKAH SERVER ANDA GAGAL MULAI? Anda sendirian, tetapi mungkin ada masalah dengan file sertifikat Anda. Anda dapat memeriksa kesalahan start-up dengan menjalankan mongod
secara manual:
sudo mongod --config /etc/mongod.conf
Langkah 4:Uji setelan server Anda
Sebelum kita mengotak-atik konfigurasi Node, mari pastikan bahwa pengaturan server Anda berfungsi dengan baik dengan menghubungkan dengan mongo
klien baris perintah:
mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates
Kecuali jika nama domain pada sertifikat Anda adalah 127.0.0.1
atau localhost
, --sslAllowInvalidHostnames
bendera diperlukan. Tanpa itu, Anda mungkin akan mendapatkan kesalahan ini:
E NETWORK The server certificate does not match the host name 127.0.0.1
E QUERY Error: socket exception [CONNECT_ERROR] for
at connect (src/mongo/shell/mongo.js:179:14)
at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed
Langkah 5:Konfigurasi Node.JS / Mongoose
Jika Anda menggunakan node-mongodb-native
paket di aplikasi Node Anda, segera hentikan dan mulai gunakan Mongoose. Tidak sesulit itu. Yang mengatakan, mongoose.connect()
memiliki API yang hampir sama dengan mongodb.connect()
, jadi gantilah dengan tepat.
var fs = require('fs')
, mongoose = require('mongoose')
, mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
, mongoOpt = {
"sslValidate": false,
"sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
"sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt')
}
;
mongoose.connect(mongoUri, mongoOpt);
Langkah 6:[Opsional] verifikasi Sertifikat Anda melalui Otoritas Sertifikat
Untuk memvalidasi Sertifikat SSL, Anda perlu mendapatkan CA (atau bundel ) dari Otoritas Sertifikat Anda. Ini akan sangat mirip dengan file Sertifikat Anda, tetapi sering kali berisi beberapa Sertifikat (yang membentuk rantai kepercayaan untuk memverifikasi bahwa sertifikat itu valid ). Jika Anda menggunakan sertifikat yang ditandatangani sendiri, Anda dapat menggunakan mongodb-cert.crt
Anda sebagai file CA.
Anda juga perlu memastikan bahwa nama host server MongoDB Anda cocok dengan yang digunakan untuk membuat sertifikat.
Langkah 6.3:Perbarui mongod
Anda konfigurasi
sudo vi /etc/mongod.conf
dan ubah bagian "# antarmuka jaringan" seperti ini:
# network interfaces net: port: 27017 #bindIp: 127.0.0.1 ssl:
mode: allowSSL
PEMKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/mongodb-ca.crt
sudo service mongod restart
Langkah 6.4:Uji setelan server Anda
mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem
Klien Mongo dapat mengirimkan file CA juga untuk memverifikasi bahwa mereka berbicara dengan server yang benar. Ini dilakukan dengan --sslCAFile
parameter
Server Mongo yang dikonfigurasi dengan CAFile mengharuskan klien memiliki Sertifikat yang valid DAN Kunci Pribadi untuk server. Di klien mongo shell, ini dilakukan dengan meneruskan --sslPEMKeyFile
parameter.
Tanpa file PEM (yang berisi Sertifikat server ), Anda mungkin melihat kesalahan ini:
I NETWORK DBClientCursor::init call() failed
E QUERY Error: DBClientBase::findN: transport error: 127.0.0.1:27017 ns: admin.$cmd query: { whatsmyuri: 1 }
at connect (src/mongo/shell/mongo.js:179:14)
at (connect):1:6 at src/mongo/shell/mongo.js:179
exception: connect failed
Server dapat dikonfigurasi untuk menerima permintaan dari klien tanpa file PEM dengan mengaktifkan net.ssl.weakCertificateValidation
, tetapi Anda akan melemahkan keamanan Anda tanpa keuntungan nyata.
Langkah 6.5:Konfigurasi Node.JS / Mongoose
Ada beberapa gotcha di sini, jadi bersabarlah.
Pertama, Anda PERLU memiliki node-mongodb-native
2.0
atau nanti. Jika Anda menggunakan Mongoose, maka Anda MEMBUTUHKAN 4.0
Mon atau nanti. Versi Mongoose sebelumnya menggunakan node-mongodb-native
1.*
yang tidak mendukung validasi Sertifikat dalam kapasitas apa pun.
Kedua, tidak ada sslAllowInvalidHostnames
atau opsi serupa yang tersedia di node-mongodb-native. Ini bukan sesuatu yang node-mongodb-native
pengembang dapat memperbaikinya (Saya akan melakukannya sekarang ) karena pustaka TLS asli yang tersedia di Node 0.10.* tidak menawarkan opsi untuk ini. Di Node 4.* dan 5.*, ada checkServerIdentity
opsi yang menawarkan harapan, tetapi beralih dari cabang Node asli ke cabang setelah penggabungan io.js dapat menyebabkan sedikit sakit kepala saat ini.
Jadi mari kita coba ini:
var fs = require('fs')
, mongoose = require('mongoose')
, mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
, mongoOpt = {
"server": {
"sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
"sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
"sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
}
}
;
Jika Anda mendapatkan kesalahan ketidakcocokan nama host/IP, perbaiki sertifikat Anda, atau batalkan semua kerja keras ini dengan menonaktifkan sslValidate
:
var fs = require('fs')
, mongoose = require('mongoose')
, mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
, mongoOpt = {
"server": {
"sslValidate": false,
"sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
"sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
"sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
}
}
;
Sumber