ScaleGrid stöder SSL-konfiguration för MongoDB och kan enkelt ställas in enligt beskrivningen i ett tidigare inlägg. Den diskuterar också behovet och för- och nackdelarna med MongoDB med TLS/SSL.
ScaleGrid använder för närvarande självsignerade certifikat för SSL när man skapar noder för ett nytt kluster. Eftersom Node.js-applikationer över MongoDB Node.js-drivrutinen eller Mongoose är mycket populära val på vår plattform, skapade vi det här inlägget för att dela en steg-för-steg-lösningsplan för de vanligaste problemen med att använda MongoDB SSL med självsignerad certifikat i Node.js. Den här diskussionen avser MongoDB Node.js version 2.0 och Mongoose version 4.0.3.
På ScaleGrid ger vi dig också möjligheten att köpa dina egna SSL-certifikat och konfigurera dem på MongoDB-servern. Skicka ett e-postmeddelande till [email protected] om du vill veta mer om denna möjlighet.
Lägger till CA-certifikatfil
För att förbättra säkerheten för din SSL-anslutning kan du ange vilken CA som ska användas för att validera MongoDB-serverns SSL-certifikat. Node.js har en standardlista med välkända "root"-CA:er som den konsulterar om en CA inte anges under tiden för att skapa anslutningar. Men eftersom vi pratar om självsignerade certifikat måste vi ange en CA-certifikatfil för verifiering. Du kan kopiera CA-certifikatfilen som användes för självsignering till klientdatorn (för ScaleGrid, detta beskrivs i vårt äldre SSL-inlägg), och sedan använda sslCA
alternativet för att peka på sökvägen till denna fil, vilket möjliggör även serververifiering.
Mangust
-
För fristående kluster:
var fs = require('fs'); var mongoose = require('mongoose'); var certFileBuf = fs.readFileSync(<path to CA cert file>); var mongoUrl = 'mongodb://admin:[email protected]:27017/admin?ssl=true'; var options = { server: { sslCA: certFileBuf } }; mongoose.connect(mongoUrl, options); ...
-
För replikuppsättningskluster:
var fs = require('fs'); var mongoose = require('mongoose'); var certFileBuf = fs.readFileSync(<path to CA cert file>); var mongoUrl = 'mongodb://admin:[email protected]:27017,test1.servers.example.com.com:27017/admin?replicaSet=RS-rstestNode-0&ssl=true'; var options = { replset: { sslCA: certFileBuf } } mongoose.connect(mongoUrl, options); ...
MongoDB Native Driver (och omslag runt den, som Mongoskin)
-
För fristående kluster:
var certFileBuf = fs.readFileSync(<path to CA cert file>); var mongoUrl = 'mongodb://admin:[email protected]:27017/admin?ssl=true'; var options = { server: { sslCA: certFileBuf} }; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); MongoClient.connect(mongoUrl, options, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); db.close(); });
-
För replikuppsättningskluster:
Alternativparametern för replikuppsättningar är replSet :
var options = { replSet: { sslCA: certFileBuf } }; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); MongoClient.connect(mongoUrl, options, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); db.close(); });
Inaktivera SSL-certifikatverifiering
Du kan inaktivera SSL-certifikatverifiering helt och hållet. Detta är kanske enklast att göra och säkerligen att det fungerar för dig, men det är inte den rekommenderade vägen att gå. MongoDB-drivrutinen tillhandahåller SSL-alternativ på servernivå och replikuppsättningsnivå (sslValidate
, sslCA
, sslCert
, sslKey
, sslPass
) för att konfigurera SSL-anslutningar. Alla alternativ beskrivs i detalj i dokumentationen.
När det gäller självsignerade certifikat är det mest användbara alternativet sslValidate
. Detta kan ställas in på
false
vid fel som: DEPTH_ZERO_SELF_SIGNED_CERT
(självsignerat certifikat). Detta inaktiverar SSL-certifikatverifiering men anslutningen förblir fortfarande krypterad.
Mongoose låter dig skicka parametrar ner till föraren i det anslutningssamtal. Till exempel:
-
Replica Set Clusters:
sslValidate
måste ställas in påfalse
vid alternativet ReplicaSet så:var mongoose = require('mongoose'); var mongoUrl = 'mongodb://admin:[email protected]:27017,test1.servers.example.com.com:27017/admin?replicaSet=RS-rstestNode-0&ssl=true'; var options = { replset: {sslValidate: false} } mongoose.connect(mongoUrl, options); ...
-
För MongoDB Native Driver:
var options = { replSet: { sslValidate: false } }; var MongoClient = require('mongodb').MongoClient , assert = require('assert'); MongoClient.connect(mongoUrl, options, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); db.close(); });
Inaktivera värdnamnsverifiering
Istället för att helt inaktivera SSL-validering, om värdnamn är ett problem, kan man bara inaktivera värdnamnsverifiering.
Värdnamnsverifiering, som en del av CA-certifikatverifieringen, är för närvarande konfigurerbar. Det rekommenderas alltid att denna verifiering aktiveras. Det kan dock leda till verifieringsfel även om det finns den minsta missmatchning i värdnamnet, som i CA-certifikatet kontra klienten som försöker ansluta. Således erbjuder de flesta TLS/SSL-servrar ett sätt att stänga av det. Till exempel. Java MongoDB-drivrutinen 3.0 tillåter ett sätt att inaktivera värdnamnsverifiering via sslInvalidHostNameAllowed
fast egendom. För MongoDB Native Driver 2.0 och senare, en boolesk alternativparameter checkServerIdentity (standard true ) tillhandahålls för att inaktivera värdnamnsverifiering. Det är tillgängligt både på individuell server- och replikuppsättningsnivå.