sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB SSL med selvsignerede certifikater i Node.js

ScaleGrid understøtter SSL-konfiguration til MongoDB og kan nemt konfigureres som beskrevet i et tidligere indlæg. Den diskuterer også behovet og fordele og ulemper ved MongoDB med TLS/SSL.

ScaleGrid bruger i øjeblikket selvsignerede certifikater til SSL, når der oprettes noder til en ny klynge. Da Node.js-applikationer over MongoDB Node.js-driveren eller Mongoose er meget populære valg på vores platform, har vi oprettet dette indlæg for at dele en trin-for-trin løsningsplan for de mest almindelige problemer med at bruge MongoDB SSL med selvsigneret certifikater i Node.js. Denne diskussion vedrører MongoDB Node.js version 2.0 og Mongoose version 4.0.3.

Hos ScaleGrid giver vi dig også mulighed for at købe dine egne SSL-certifikater og konfigurere dem på MongoDB-serveren. Send en e-mail til [email protected] for at få mere at vide om denne mulighed.

Tilføjelse af CA-certifikatfil

For at forbedre sikkerheden af ​​din SSL-forbindelse kan du angive den CA, der skal bruges til at validere MongoDB-serverens SSL-certifikat. Node.js har en standardliste over velkendte "root" CA'er, som den konsulterer, hvis en CA ikke er angivet under oprettelsestiden for forbindelsen. Men da vi taler om selvsignerede certifikater, bliver vi nødt til at angive en CA-certifikatfil til verifikation. Du kan kopiere CA-certifikatfilen, der blev brugt til selvsignering til klientmaskinen (for ScaleGrid er dette beskrevet i vores ældre SSL-indlæg), og derefter bruge sslCA mulighed for at pege på stien til denne fil og dermed også aktivere serverbekræftelse.

Mangust

  • For selvstændige klynger:

    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);
    ...
    
  • For replikasætklynger:

    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 (og omslutter den, som Mongoskin)

  • For selvstændige klynger:

    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();
     });
    
    
  • For replikasætklynger:

    Indstillingsparameteren for replikasæt er 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();
     });
    
    

Deaktivering af SSL-certifikatbekræftelse

Du kan også deaktivere SSL-certifikatbekræftelse helt. Dette er måske nemmest at gøre og mest sikkert at arbejde for dig, men det er ikke den anbefalede vej at gå. MongoDB-driveren giver SSL-indstillinger på serverniveau og replika-sætniveau (sslValidate , sslCA , sslCert , sslKey , sslPass ) for at konfigurere SSL-forbindelser. Alle muligheder er beskrevet detaljeret i dokumentationen.

I tilfælde af selvsignerede certifikater er den mest nyttige mulighed sslValidate . Dette kan indstilles til falsk i tilfælde af fejl som: DEPTH_ZERO_SELF_SIGNED_CERT (selvunderskrevet certifikat). Dette deaktiverer SSL-certifikatbekræftelse, men forbindelsen forbliver stadig krypteret.

Mongoose lader dig sende parametre ned til driveren i dets forbindelsesopkald. For eksempel:

  • Replikasætklynger:

    sslValidate skal indstilles til false ved indstillingen 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);
    ...
    
  • For 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();
     });
    
    

Deaktivering af værtsnavnsbekræftelse

I stedet for helt at deaktivere SSL-validering, hvis værtsnavne er et problem, kan man bare deaktivere værtsnavnsbekræftelse.

Værtsnavnsbekræftelse, som en del af CA-certifikatbekræftelsen, kan i øjeblikket konfigureres. Det anbefales altid, at denne bekræftelse er slået til. Det kan dog føre til verifikationsfejl, selvom der er den mindste uoverensstemmelse i værtsnavnet, som i CA-certifikatet kontra klienten, der forsøger at oprette forbindelse. Således tilbyder de fleste TLS/SSL-servere en måde at slå det fra. For eksempel. Java MongoDB-driveren 3.0 tillader en måde at deaktivere værtsnavnsbekræftelse via sslInvalidHostNameAllowed ejendom. For MongoDB Native Driver 2.0 og nyere, en boolesk indstillingsparameter checkServerIdentity (standard sand ) er angivet for at deaktivere værtsnavnsbekræftelse. Den er tilgængelig både på det individuelle server- og replikasætniveau.


  1. Luk mongooses forbindelse korrekt, når du er færdig

  2. MongoDB:undtagelse i initAndListen:20 Forsøgte at oprette en låsefil på en skrivebeskyttet mappe:/data/db, afsluttende

  3. Sådan OG og IKKE i MongoDB $tekstsøgning

  4. hvordan man konverterer streng til numeriske værdier i mongodb