Krok 1:Získejte MongoDB 3.0
První věc, kterou potřebujete vědět, je, že SSL je podporováno pouze předinstalovaným MongoDB 3.0 a novějším. Ubuntu nemá ve výchozích úložištích 3.0, takže to získáte takto:
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 je zatím nejnovější stabilní verze, ale klidně nahraďte 3.0.7 svým oblíbeným vydáním.
Krok 2:Získejte soukromý klíč, certifikát a soubory PEM
PEM obsahuje certifikát veřejného klíče a jeho přidružený soukromý klíč. Tyto soubory lze získat buď za IRL dolary od certifikační autority, nebo vygenerovat pomocí OpenSSL takto:
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 bude použit jako soubor PEM, mongodb-cert.key je soubor soukromého klíče a mongodb-cert.crt je soubor certifikátu, který lze také použít jako soubor CA. BUDETE POTŘEBOVAT VŠECHNY TŘI.
Krok 3:Konfigurace MongoD
Budeme předpokládat, že jste tyto soubory zkopírovali do složky /etc/ssl/, kam patří. Nyní otevřeme náš konfigurační soubor MongoDB:
sudo vi /etc/mongod.conf
a upravte sekci "# síťových rozhraní" takto:
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
ssl:
mode: allowSSL
PEMKeyFile: /etc/ssl/mongodb.pem
#CAFile: /etc/ssl/mongodb-cert.crt
POZNÁMKA :komentujeme bindIp
. TOTO UMOŽŇUJE EXTERNÍM PŘIPOJENÍ přístup k vaší databázi Mongo. Předpokládáme, že toto je váš konečný cíl (Proč byste šifrovali provoz na localhost? ), ale měli byste to udělat až PO NASTAVENÍ PRAVIDEL AUTORIZACE pro váš server MongoDB.
Soubor CAF je také zakomentován, protože je volitelný. Na konci tohoto příspěvku vysvětlím, jak nastavit důvěryhodnost certifikační autority.
Jako vždy musíte restartovat MongoDB, než se změny v konfiguračním souboru projeví:
sudo service mongod restart
NESPĚLO SE VÁŠ SERVER SPUSTIT? Jste na to sami, ale pravděpodobně došlo k problému se soubory certifikátů. Chyby při spouštění můžete zkontrolovat spuštěním mongod
ručně:
sudo mongod --config /etc/mongod.conf
Krok 4:Otestujte nastavení serveru
Než se pustíme do konfigurací uzlů, ujistíme se, že nastavení vašeho serveru funguje správně připojením k mongo
klient příkazového řádku:
mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates
Pokud název domény na vašem certifikátu není 127.0.0.1
nebo localhost
, --sslAllowInvalidHostnames
vlajka je nutná. Bez něj pravděpodobně dostanete tuto chybu:
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
Krok 5:Konfigurace Node.JS / Mongoose
Pokud používáte node-mongodb-native
balíček ve vaší aplikaci Node, okamžitě zastavte a začněte používat Mongoose. Není to tak těžké. Tedy mongoose.connect()
má prakticky stejné API jako mongodb.connect()
, takže je vhodně nahraďte.
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);
Krok 6:[Volitelně] ověřte své certifikáty prostřednictvím certifikační autority
Abyste mohli ověřit své certifikáty SSL, musíte získat CA (nebo balíček ) od vaší certifikační autority. Bude to vypadat hodně jako váš soubor certifikátu, ale často bude obsahovat více certifikátů (které tvoří řetězec důvěry k ověření platnosti certifikátu ). Pokud používáte certifikát s vlastním podpisem, můžete použít svůj mongodb-cert.crt
jako soubor CA.
Budete také muset zajistit, aby se název hostitele vašeho serveru MongoDB shodoval s názvem použitým k vytvoření certifikátu.
Krok 6.3:Aktualizujte svůj mongod
konfigurace
sudo vi /etc/mongod.conf
a upravte sekci "# síťových rozhraní" takto:
# 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
Krok 6.4:Otestujte nastavení serveru
mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem
Klienti Mongo mohou také předat soubor CA, aby ověřili, že mluví se správným serverem. To se provádí pomocí --sslCAFile
parametr
Servery Mongo nakonfigurované pomocí souboru CAFile vyžadují, aby klienti vlastnili platný certifikát A soukromý klíč pro server. V mongo shell klientovi se to provede předáním --sslPEMKeyFile
parametr.
Bez souboru PEM (který obsahuje certifikát serveru ), může se zobrazit tato chyba:
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 lze nakonfigurovat tak, aby přijímal požadavky od klientů bez souboru PEM povolením net.ssl.weakCertificateValidation
, ale bez skutečného zisku oslabíte svou bezpečnost.
Krok 6.5:Konfigurace Node.JS / Mongoose
Je tu pár šmejdů, tak mějte strpení.
Nejprve POTŘEBUJETE mít node-mongodb-native
2.0
nebo později. Pokud používáte Mongoose, pak POTŘEBUJETE Mongoose 4.0
nebo později. Předchozí verze Mongoose používají node-mongodb-native
1.*
který v žádném případě nepodporuje ověřování certifikátů.
Za druhé, neexistují žádné sslAllowInvalidHostnames
nebo podobná možnost dostupná v node-mongodb-native. Toto není něco, co node-mongodb-native
vývojáři mohou opravit (už bych měl ), protože nativní knihovna TLS dostupná v Node 0.10.* pro to nenabízí žádnou možnost. V Node 4.* a 5.* je checkServerIdentity
možnost, která nabízí naději, ale přepnutí z původní větve Node do větve po sloučení io.js může v současné době způsobit trochu bolesti hlavy.
Takže zkusíme toto:
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')
}
}
;
Pokud se vám zobrazují chyby nesouladu názvu hostitele/IP, buď opravte svůj certifikát, nebo zrušte veškerou tuto tvrdou práci vypnutím 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')
}
}
;
Zdroj