MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Свързване с MongoDB през SSL с Node.js

Стъпка 1:Вземете MongoDB 3.0

Първото нещо, което трябва да знаете, е, че този SSL се поддържа само от MongoDB 3.0 и по-нови версии. Ubuntu няма 3.0 в хранилищата по подразбиране, така че ето как да го получите:

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 е най-новата стабилна версия към момента, но не се колебайте да замените 3.0.7 с любимата си версия.

Стъпка 2:Получаване на частен ключ, сертификат и PEM файлове

PEM съдържа сертификат за публичен ключ и свързан с него частен ключ. Тези файлове могат да бъдат получени или с IRL долари от сертификационен орган, или генерирани с OpenSSL по следния начин:

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 ще се използва като PEM файл, mongodb-cert.key е файлът с частен ключ, а mongodb-cert.crt е файл на сертификата, който може да се използва и като CA файл. ЩЕ ВИ ТРЯБВА ВСИЧКИ ТРИ ОТ ТЕЗИ.

Стъпка 3:Конфигуриране на MongoD

Ще приемем, че сте копирали тези файлове във вашата папка /etc/ssl/, където им принадлежат. Сега отваряме нашия конфигурационен файл на MongoDB:

sudo vi /etc/mongod.conf

и променете секцията "# мрежови интерфейси" по следния начин:

# network interfaces
net:
  port: 27017
  #bindIp: 127.0.0.1
  ssl:
    mode: allowSSL
    PEMKeyFile: /etc/ssl/mongodb.pem
    #CAFile: /etc/ssl/mongodb-cert.crt

МОЛЯ, ЗАБЕЛЕЖЕТЕ :коментираме bindIp . ТОВА ПОЗВОЛЯВА НА ВЪНШНИ ВРЪЗКИ да имат достъп до вашата база данни Mongo. Предполагаме, че това е крайната ви цел (Защо ще шифрова трафика ви на localhost?). ), но трябва да направите това само СЛЕД НАСТРОЙКАТА НА ПРАВИЛАТА ЗА АВТОРИЗАЦИЯ за вашия MongoDB сървър.

CAFileът също се коментира, тъй като не е задължителен. Ще обясня как да настроите доверие на сертифициращия орган в края на тази публикация.

Както винаги, трябва да рестартирате MongoDB, преди промените в конфигурационния файл да влязат в сила:

sudo service mongod restart

ВАШИЯТ СЪРВЪР НЕ УСПЕ ДА СТАРТИРА? Вие сте сами, но вероятно има проблем с вашите файлове със сертификат. Можете да проверите грешките при стартиране, като изпълните mongod ръчно:

sudo mongod --config /etc/mongod.conf

Стъпка 4:Тествайте настройките на сървъра си

Преди да започнем да се забърквам с конфигурациите на Node, нека се уверим, че настройката на вашия сървър работи правилно, като се свържете с mongo клиент на командния ред:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

Освен ако името на домейна във вашия сертификат не е 127.0.0.1 или localhost , --sslAllowInvalidHostnames флагът е необходим. Без него вероятно ще получите тази грешка:

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

Стъпка 5:Конфигуриране на Node.JS / Mongoose

Ако използвате node-mongodb-native пакет във вашето приложение Node, спрете незабавно и започнете да използвате Mongoose. Не е толкова трудно. Това каза, mongoose.connect() има практически същия API като mongodb.connect() , така че заменете по подходящ начин.

    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);

Стъпка 6:[По избор] проверете вашите сертификати чрез сертифициращ орган

За да потвърдите вашите SSL сертификати, трябва да получите CA (или пакет ) файл от вашия сертифициращ орган. Това ще изглежда много като вашия файл със сертификат, но често ще съдържа множество сертификати (което формира верига на доверие, за да се провери дали сертификатът е валиден ). Ако използвате самоподписан сертификат, можете да използвате своя mongodb-cert.crt като CA файл.

Също така ще трябва да се уверите, че името на хоста на вашия MongoDB сървър съвпада с това, използвано за създаване на сертификата.

Стъпка 6.3:Актуализирайте вашия mongod конфигурация

sudo vi /etc/mongod.conf

и променете секцията "# мрежови интерфейси" по следния начин:

# 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

Стъпка 6.4:Тествайте настройките на вашия сървър

mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem

Клиентите на Mongo могат да предадат и CA файла, за да проверят дали разговарят с правилния сървър. Това се прави с --sslCAFile параметър

Сървърите Mongo, конфигурирани с CAFile, изискват клиентите да притежават валиден сертификат И частния ключ за сървъра. В mongo shell клиента това се прави чрез подаване на --sslPEMKeyFile параметър.

Без PEM файл (който съдържа сертификата на сървъра ), може да видите тази грешка:

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

Сървърът може да бъде конфигуриран да приема заявки от клиенти без PEM файл, като активирате net.ssl.weakCertificateValidation , но ще отслабите сигурността си без реална печалба.

Стъпка 6.5:Конфигуриране на Node.JS / Mongoose

Тук има няколко проблеми, така че търпете.

Първо, ТРЯБВА да имате node-mongodb-native 2.0 или по-късно. Ако използвате Mongoose, тогава имате нужда от Mongoose 4.0 или по-късно. Предишните версии на Mongoose използват node-mongodb-native 1.* който не поддържа валидиране на сертификат в каквото и да е качество.

Второ, няма sslAllowInvalidHostnames или подобна опция, налична в node-mongodb-native. Това не е нещо, което node-mongodb-native разработчиците могат да поправят (вече щях да го направя ), тъй като родната TLS библиотека, налична в Node 0.10.*, не предлага опция за това. В възел 4.* и 5.* има checkServerIdentity опция, която предлага надежда, но преминаването от оригиналния клон на Node към клона след сливането на io.js може да причини малко главоболие в момента.

Така че нека опитаме това:

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')
      }
    }
  ;

Ако получавате грешки при несъответствие на име на хост/IP, или поправете сертификата си, или отменете цялата тази упорита работа, като деактивирате 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')
      }
    }
  ;

Източник



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB на AWS:Как да изберем правилния тип EC2 инстанция за вашия MongoDB сървър?

  2. Какво се случва с Meteor и Fibers/bindEnvironment()?

  3. Каква версия на MongoDB е инсталирана на Ubuntu

  4. Как да върнете масив от низ с mongodb агрегиране

  5. Как MongoDB дава възможност за машинно обучение