Trin 1:Få MongoDB 3.0
Den første ting du skal vide er, at SSL kun understøttes out-of-the-box af MongoDB 3.0 og nyere. Ubuntu har ikke 3.0 i standardlagrene, så her er hvordan du får det:
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 er den seneste stabile version lige nu, men erstat gerne 3.0.7 med din yndlingsudgivelse.
Trin 2:Få privat nøgle, certifikat og PEM-filer
PEM'en indeholder et offentligt nøglecertifikat og det tilhørende private nøgle. Disse filer kan enten fås med IRL-dollars fra en certifikatautoritet eller genereres med OpenSSL som sådan:
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 vil blive brugt som PEM-filen, mongodb-cert.key er Private Key-filen, og mongodb-cert.crt er Certificate-fil, som også kan bruges som CA-fil. DU SKAL BRUGE ALLE TRE AF DISSE.
Trin 3:Konfigurer MongoD
Vi vil antage, at du kopierede disse filer til din /etc/ssl/-mappe, hvor de hører hjemme. Nu åbner vi vores MongoDB-konfigurationsfil:
sudo vi /etc/mongod.conf
og modificer afsnittet "# netværksgrænseflader" sådan:
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
ssl:
mode: allowSSL
PEMKeyFile: /etc/ssl/mongodb.pem
#CAFile: /etc/ssl/mongodb-cert.crt
BEMÆRK VENLIGST :vi kommenterer bindIp
. DETTE TILLADER EKSTERNE FORBINDELSER for at få adgang til din Mongo-database. Vi antager, at dette er dit slutmål (Hvorfor ville din kryptere trafik på localhost? ), men du bør kun gøre dette EFTER OPSÆTNING AF GODKENDELSESREGLER for din MongoDB-server.
CAFilen er også kommenteret ud, da den er valgfri. Jeg vil forklare, hvordan du opretter Certificate Authority-tillid i slutningen af dette indlæg.
Som altid skal du genstarte MongoDB, før ændringer af konfigurationsfilen træder i kraft:
sudo service mongod restart
BLEV DIN SERVER IKKE AT STARTE? Du er alene, men der er sandsynligvis et problem med dine certifikatfiler. Du kan tjekke opstartsfejl ved at køre mongod
manuelt:
sudo mongod --config /etc/mongod.conf
Trin 4:Test dine serverindstillinger
Inden vi går og roder med Node-konfigurationer, lad os sikre os, at din serveropsætning fungerer korrekt ved at oprette forbindelse til mongo
kommandolinjeklient:
mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates
Medmindre domænenavnet på dit certifikat er 127.0.0.1
eller localhost
, --sslAllowInvalidHostnames
flag er nødvendigt. Uden det vil du sandsynligvis få denne fejlmeddelelse:
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
Trin 5:Konfigurer Node.JS / Mongoose
Hvis du bruger node-mongodb-native
pakke i din Node-applikation, stop med det samme og begynd at bruge Mongoose. Det er ikke så svært. Når det er sagt, mongoose.connect()
har stort set samme API som mongodb.connect()
, så udskift passende.
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);
Trin 6:[Valgfrit] bekræfter dine certifikater via en certifikatmyndighed
For at validere dine SSL-certifikater skal du have et CA (eller bundle ) fil fra din certifikatmyndighed. Dette vil ligne din certifikatfil meget, men vil ofte indeholde flere certifikater (som danner en tillidskæde for at bekræfte, at et certifikat er gyldigt ). Hvis du bruger et selvsigneret certifikat, kan du bruge dit mongodb-cert.crt
som en CA-fil.
Du skal også sikre dig, at din MongoDB-servers værtsnavn stemmer overens med det, der blev brugt til at oprette certifikatet.
Trin 6.3:Opdater din mongod
konfiguration
sudo vi /etc/mongod.conf
og modificer afsnittet "# netværksgrænseflader" sådan:
# 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
Trin 6.4:Test dine serverindstillinger
mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem
Mongo-klienter kan også sende CA-filen ind for at bekræfte, at de taler til den korrekte server. Dette gøres med --sslCAFile
parameter
Mongo-servere konfigureret med en CAFile kræver, at klienter har et gyldigt certifikat OG den private nøgle til serveren. I mongo shell-klienten gøres dette ved at indsætte --sslPEMKeyFile
parameter.
Uden en PEM-fil (som indeholder serverens certifikat ), kan du se denne fejl:
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
Serveren kan konfigureres til at acceptere anmodninger fra klienter uden en PEM-fil ved at aktivere net.ssl.weakCertificateValidation
, men du vil svække din sikkerhed uden nogen reel gevinst.
Trin 6.5:Konfigurer Node.JS / Mongoose
Der er et par gotchas her, så bær over med mig.
Først SKAL du have node-mongodb-native
2.0
eller senere. Hvis du bruger Mongoose, SKAL du BRUGE Mongoose 4.0
eller senere. Tidligere Mongoose-versioner bruger node-mongodb-native
1.*
som ikke understøtter certifikatvalidering på nogen måde.
For det andet er der ingen sslAllowInvalidHostnames
eller lignende mulighed tilgængelig i node-mongodb-native. Dette er ikke noget, der er node-mongodb-native
udviklere kan rette (det ville jeg have nu ), fordi det oprindelige TLS-bibliotek, der er tilgængeligt i Node 0.10.*, ikke tilbyder nogen mulighed for dette. I Node 4.* og 5.* er der en checkServerIdentity
mulighed, som giver håb, men at skifte fra den originale Node-gren til grenen efter io.js-fusionen kan forårsage en smule hovedpine på nuværende tidspunkt.
Så lad os prøve dette:
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')
}
}
;
Hvis du får hostnavn/IP mismatch-fejl, skal du enten rette dit certifikat eller afvise alt dette hårde arbejde ved at deaktivere 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')
}
}
;
Kilde