sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB SSL med självsignerade certifikat i Node.js

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å.


  1. MongoDB $toString

  2. Hur man tar bort ett fält från ett MongoDB-dokument ($unset)

  3. Hur man isolerar spring boot app redis och spring boot session global redis

  4. Tvinga mongodb att mata ut strikt JSON