2015-01-23 2 views
0

Как я могу подключить MongoDB и nodejs над SSL,
Я использую этот код для создания соединения, но он не работаетMongoDb и nodejs SSl/Secure Connection

var Db = require('mongodb').Db; 
var Server = require('mongodb').Server; 
Db.connect('mongodb://xxx.xxx.xxx.xxx:27017/db-login', { auto_reconnect: true, poolSize:4, ssl:true }, function (err, db) { 

я также попробовал другой код

var localIP='xxx.xxx.xxx.xxx:27017', ssl=true; 

любая помощь и предложения

ответ

2

Используйте ссылки ниже для настройки SSL в среде MongoDB.

SSL должен быть включен в среде MongoDB, а SSL должен быть включен в вашем приложении.

http://docs.mongodb.org/manual/tutorial/configure-ssl/http://docs.mongodb.org/manual/tutorial/configure-ssl-clients/

Вы можете настроить соединение SSL в узле, как следует:

var options = { 
    key: fs.readFileSync('ssl/your_ssl_key.key'), 
    cert: fs.readFileSync('ssl/your_ssl_cert.cert') 
}; 

https.createServer(options, app).listen(443); 

Если вы хотите, чтобы соединение по протоколу HTTPS для всех пользователей, вы можете заставить редирект:

require("http").createServer(function (req, res) { 
    res.writeHead(301, { 
     'Content-Type': 'text/plain', 
     'Location': 'https://' + req.headers.host + req.url 
    }); 
    res.end('Redirecting to SSL\n'); 
}).listen(80); 

https.createServer(options, app).listen(443); 
+0

Мне нужно установить соединение только с MongoDB ssl, а ssl-соединение работает с использованием кода python, но когда я пытаюсь создать соединение в nodejs, это не работает здесь –

+0

@AtulJain Вы уверены, что ваша среда Mongo настроена правильно для использования SSL? Потому что то, что вы делаете с параметрами параметров {ssl: true}, является правильным. Но это работает, только если SSL настроен правильно в MongoDB – Billy

+0

да, потому что я могу получить к нему доступ "" https: // xxx.xxx.xxx.xxx:28017 "" ", и даже в python я обращаюсь к нему с помощью ssl = true –

2

Шаг 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-файлы

П содержит сертификат открытого ключа и соответствующий секретный ключ. Эти файлы могут быть либо получены с IRL долларов от Authroity сертификата или сгенерированы с помощью 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

Мы будем считать, что вы скопировали эти файлы в/и т.д./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 

ЛИ ВАШ СЕРВЕР FAIL НАЧАТЬ? Вы сами по себе, но, вероятно, проблема с вашими файлами сертификатов. Вы можете проверить ошибки пусконаладочные запустив mongod вручную:

sudo mongod --config /etc/mongod.conf 

Шаг 4: Проверьте настройки сервера

Перед тем, как идти Мессинг с конфигурациями узлов, давайте удостоверимся, что ваша установка сервера работает правильно при подключении с Монго командной строки клиента:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates 

Если доменное имя в сертификате не 127.0.0.1 или локальный флаг --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

Если вы используете узел-MongoDB-родной пакет в приложении узла, немедленно прекратить и запуск используя Mongoose. Это не так сложно. При этом mongoose.connect() имеет практически тот же API, что и mongodb.connect(), поэтому замените его соответствующим образом.

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

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 это делается путем передачи в параметре -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

Есть несколько подводных камней здесь, так голые со мной.

Во-первых, вам НЕОБХОДИМО иметь узел-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, которая дает надежду, но переход от исходной ветви узла к ветке после слияния 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') 
     } 
    } 
    ; 

Источник:

+3

Просто ссылка на ваш собственный блог не является хорошим ответом. Связываясь с ним, объясняя, как он решает проблему, и предоставление сущности ее содержания дает лучший ответ. См.: [Как я могу ссылаться на внешний ресурс в общинный способ?] (// meta.stackexchange.com/questions/94022/) – Mogsdad

+0

Спасибо за обмен – sivi