Stap 1:verkrijg MongoDB 3.0
Het eerste dat u moet weten, is dat SSL alleen out-of-the-box wordt ondersteund door MongoDB 3.0 en hoger. Ubuntu heeft geen 3.0 in de standaard repositories, dus hier is hoe je het krijgt:
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 is vanaf nu de nieuwste stabiele versie, maar voel je vrij om 3.0.7 te vervangen door je favoriete release.
Stap 2:Verkrijg privésleutel, certificaat en PEM-bestanden
De PEM bevat een Public Key Certificaat en de bijbehorende Private Key. Deze bestanden kunnen ofwel worden verkregen met IRL-dollars van een Certificaatautoriteit of als volgt worden gegenereerd met 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 wordt gebruikt als het PEM-bestand, mongodb-cert.key is het privésleutelbestand en mongodb-cert.crt is het certificaatbestand dat ook als CA-bestand kan worden gebruikt. JE HEBT DEZE ALLE DRIE NODIG.
Stap 3:MongoD configureren
We gaan ervan uit dat je deze bestanden hebt gekopieerd naar je /etc/ssl/ map waar ze thuishoren. Nu openen we ons MongoDB-configuratiebestand:
sudo vi /etc/mongod.conf
en wijzig de sectie "# netwerkinterfaces" als volgt:
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
ssl:
mode: allowSSL
PEMKeyFile: /etc/ssl/mongodb.pem
#CAFile: /etc/ssl/mongodb-cert.crt
LET OP :we geven commentaar op bindIp
. DIT STAAT EXTERNE VERBINDINGEN TOE om toegang te krijgen tot uw Mongo-database. We gaan ervan uit dat dit uw einddoel is (Waarom zou u verkeer op localhost versleutelen? ), maar u moet dit alleen doen NA HET INSTELLEN VAN AUTORISATIEREGELS voor uw MongoDB-server.
Het CAFile wordt ook becommentarieerd omdat het optioneel is. Ik zal aan het einde van dit bericht uitleggen hoe u het vertrouwen van de certificeringsinstantie kunt instellen.
Zoals altijd moet u MongoDB opnieuw opstarten voordat de wijzigingen in het configuratiebestand van kracht worden:
sudo service mongod restart
IS UW SERVER NIET GESTART? U staat er alleen voor, maar er is waarschijnlijk een probleem met uw certificaatbestanden. U kunt opstartfouten controleren door mongod
. uit te voeren handmatig:
sudo mongod --config /etc/mongod.conf
Stap 4:Test uw serverinstellingen
Voordat we gaan knoeien met Node-configuraties, laten we ervoor zorgen dat uw serverconfiguratie correct werkt door verbinding te maken met de mongo
opdrachtregelclient:
mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates
Tenzij de domeinnaam op uw certificaat 127.0.0.1
. is of localhost
, de --sslAllowInvalidHostnames
vlag is noodzakelijk. Zonder dit krijg je waarschijnlijk deze foutmelding:
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
Stap 5:Configureer Node.JS / Mongoose
Als u de node-mongodb-native
. gebruikt pakket in uw Node-toepassing, stop dan onmiddellijk en begin Mongoose te gebruiken. Het is niet zo moeilijk. Dat gezegd hebbende, mongoose.connect()
heeft vrijwel dezelfde API als mongodb.connect()
, dus vervang het op de juiste manier.
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);
Stap 6:[Optioneel] verifieer uw certificaten via een certificeringsinstantie
Om uw SSL-certificaten te valideren, moet u een CA (of bundel) verkrijgen ) bestand van uw certificeringsinstantie. Dit lijkt veel op uw certificaatbestand, maar bevat vaak meerdere certificaten (die een vertrouwensketen vormen om te controleren of een certificaat geldig is ). Als u een zelfondertekend certificaat gebruikt, kunt u uw mongodb-cert.crt
gebruiken als een CA-bestand.
U moet er ook voor zorgen dat de hostnaam van uw MongoDB-server overeenkomt met de naam die is gebruikt om het certificaat te maken.
Stap 6.3:Update je mongod
configuratie
sudo vi /etc/mongod.conf
en wijzig de sectie "# netwerkinterfaces" als volgt:
# 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
Stap 6.4:Test uw serverinstellingen
mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem
Mongo-clients kunnen ook het CA-bestand doorgeven om te controleren of ze met de juiste server praten. Dit wordt gedaan met de --sslCAFile
parameter
Mongo-servers die zijn geconfigureerd met een CAFile, vereisen dat klanten een geldig certificaat hebben EN de privésleutel voor de server. In de mongo shell-client wordt dit gedaan door de --sslPEMKeyFile
parameter.
Zonder een PEM-bestand (dat het servercertificaat bevat ), ziet u mogelijk deze fout:
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
De server kan worden geconfigureerd om verzoeken van clients zonder PEM-bestand te accepteren door net.ssl.weakCertificateValidation
in te schakelen , maar u verzwakt uw beveiliging zonder echt voordeel.
Stap 6.5:Node.JS / Mongoose configureren
Er zijn hier een paar problemen, dus geduld met me.
Eerst MOET je node-mongodb-native
. hebben 2.0
of later. Als je Mongoose gebruikt, dan heb je Mongoose 4.0
nodig of later. Eerdere Mongoose-versies gebruiken node-mongodb-native
1.*
die op geen enkele manier certificaatvalidatie ondersteunt.
Ten tweede is er geen sslAllowInvalidHostnames
of vergelijkbare optie beschikbaar in node-mongodb-native. Dit is niet iets dat node-mongodb-native
ontwikkelaars kunnen repareren (Ik zou nu hebben ) omdat de native TLS-bibliotheek die beschikbaar is in Node 0.10.* hiervoor geen optie biedt. In Node 4.* en 5.* is er een checkServerIdentity
optie die hoop biedt, maar het overschakelen van de oorspronkelijke Node-branch naar de branch na de io.js-samenvoeging kan momenteel wat hoofdpijn veroorzaken.
Dus laten we dit proberen:
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')
}
}
;
Als u hostnaam/IP-mismatch-fouten krijgt, repareer dan uw certificaat of negeer al dit harde werk door sslValidate
uit te schakelen :
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')
}
}
;
Bron