MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menghubungkan ke MongoDB melalui SSL dengan Node.js

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $indexOfCP

  2. Cara Menyebarkan Database Open edX MongoDB untuk Ketersediaan Tinggi

  3. Koneksi luwak

  4. Luwak dengan mongodb bagaimana cara mengembalikan objek yang baru saja disimpan?

  5. Melacak Penggunaan Memori MongoDB