sql >> Database >  >> NoSQL >> MongoDB

MongoDB SSL met zelfondertekende certificaten in Node.js

ScaleGrid ondersteunt SSL-configuratie voor MongoDB en kan eenvoudig worden ingesteld zoals beschreven in een eerder bericht. Het bespreekt ook de noodzaak en de voor- en nadelen van MongoDB met TLS/SSL.

ScaleGrid gebruikt momenteel zelfondertekende certificaten voor SSL bij het maken van nodes voor een nieuw cluster. Omdat Node.js-applicaties via het MongoDB Node.js-stuurprogramma of Mongoose erg populaire keuzes zijn op ons platform, hebben we dit bericht gemaakt om een ​​stapsgewijs oplossingsplan te delen voor de meest voorkomende problemen bij het gebruik van MongoDB SSL met zelfondertekende certificaten in Node.js. Deze discussie heeft betrekking op de MongoDB Node.js versie 2.0 en Mongoose versie 4.0.3.

Bij ScaleGrid bieden we u ook de mogelijkheid om uw eigen SSL-certificaten aan te schaffen en deze te configureren op de MongoDB-server. Stuur een e-mail naar [email protected] voor meer informatie over deze mogelijkheid.

CA-certificaatbestand toevoegen

Om de beveiliging van uw SSL-verbinding te verbeteren, kunt u de CA specificeren die moet worden gebruikt om het MongoDB-server SSL-certificaat te valideren. Node.js heeft een standaardlijst met bekende "root"-CA's die het raadpleegt als er geen CA is opgegeven tijdens het maken van de verbinding. Omdat we het echter hebben over zelfondertekende certificaten, moeten we een CA-certificaatbestand opgeven voor verificatie. U kunt het CA-certificaatbestand dat is gebruikt voor zelfondertekening naar de clientcomputer kopiëren (voor ScaleGrid wordt dit beschreven in ons oudere SSL-bericht) en vervolgens de sslCA gebruiken optie om naar het pad van dit bestand te wijzen, waardoor ook serververificatie wordt ingeschakeld.

Mangoest

  • Voor zelfstandige clusters:

    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);
    ...
    
  • Voor replicasetclusters:

    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 (en wrappers eromheen, zoals Mongoskin)

  • Voor zelfstandige clusters:

    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();
     });
    
    
  • Voor replicasetclusters:

    De optieparameter voor replicasets is 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();
     });
    
    

SSL-certificaatverificatie uitschakelen

U kunt SSL-certificaatverificatie ook helemaal uitschakelen. Dit is misschien het gemakkelijkst om te doen en het is zeker dat het voor u werkt, maar het is niet de aanbevolen manier om te gaan. Het MongoDB-stuurprogramma biedt SSL-opties op serverniveau en replica-setniveau (sslValidate , sslCA , sslCert , sslKey , sslPass ) om SSL-verbindingen te configureren. Alle opties worden in detail beschreven in de documentatie.

In het geval van zelfondertekende certificaten is de handigste optie de sslValidate . Dit kan worden ingesteld op false in het geval van fouten zoals: DEPTH_ZERO_SELF_SIGNED_CERT (zelf ondertekend certificaat). Dit schakelt SSL-certificaatverificatie uit, maar de verbinding blijft versleuteld.

Met Mongoose kunt u parameters doorgeven aan de bestuurder in zijn verbindingsoproep. Bijvoorbeeld:

  • Replica-setclusters:

    sslValidate moet worden ingesteld op false bij de ReplicaSet-optie dus:

    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);
    ...
    
  • Voor 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();
     });
    
    

Hostnaamverificatie uitschakelen

In plaats van SSL-validatie volledig uit te schakelen, als hostnamen een probleem vormen, kunt u de hostnaamverificatie gewoon uitschakelen.

Hostnaamverificatie, als onderdeel van de CA-certificaatverificatie, is momenteel configureerbaar. Het wordt altijd aanbevolen om deze verificatie in te schakelen. Het kan echter leiden tot verificatiemislukkingen, zelfs als er de minste mismatch is in de hostnaam, zoals in het CA-certificaat versus de client die probeert verbinding te maken. Zo bieden de meeste TLS/SSL-servers een manier om het uit te schakelen. Bijvoorbeeld. het Java MongoDB-stuurprogramma 3.0 maakt het mogelijk om hostnaamverificatie uit te schakelen via de sslInvalidHostNameAllowed eigendom. Voor MongoDB Native Driver 2.0 en hoger, een booleaanse optieparameter checkServerIdentity (standaard true ) wordt verstrekt om hostnaamverificatie uit te schakelen. Het is beschikbaar op zowel de individuele server- als replicasetniveaus.


  1. hoe de time-out van de JedisConnectionFactory-basis te configureren op het spring-boot-framework

  2. Kon geen verbinding maken met Redis om 127.0.0.1:6379:Verbinding geweigerd

  3. Hoe verwijder je één 'document' op 'ID' met behulp van de officiële C#-driver voor MongoDB?

  4. mapping in index maken in elasticsearch door mongodb-rivier heeft geen effect