Стъпка 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')
}
}
;
Източник