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

MongoDB SSL con certificati autofirmati in Node.js

ScaleGrid supporta la configurazione SSL per MongoDB e può essere facilmente configurato come descritto in un post precedente. Discute anche della necessità e dei pro e contro di MongoDB con TLS/SSL.

ScaleGrid utilizza attualmente certificati autofirmati per SSL durante la creazione di nodi per un nuovo cluster. Poiché le applicazioni Node.js sul driver MongoDB Node.js o Mongoose sono scelte molto popolari sulla nostra piattaforma, abbiamo creato questo post per condividere un piano di soluzione passo-passo ai problemi più comuni nell'utilizzo di MongoDB SSL con autofirmato certificati in Node.js. Questa discussione riguarda MongoDB Node.js versione 2.0 e Mongoose versione 4.0.3.

In ScaleGrid, ti offriamo anche la possibilità di acquistare i tuoi certificati SSL e di configurarli sul server MongoDB. Invia un'e-mail a [email protected] per ulteriori informazioni su questa opportunità.

Aggiunta del file del certificato CA

Per migliorare la sicurezza della tua connessione SSL, puoi specificare la CA da utilizzare per convalidare il certificato SSL del server MongoDB. Node.js ha un elenco predefinito di note CA "root" che consulta se una CA non è specificata durante il tempo di creazione della connessione. Tuttavia, poiché stiamo parlando di certificati autofirmati, dovremo specificare un file di certificato CA per la verifica. È possibile copiare il file del certificato CA utilizzato per l'auto-accesso nel computer client (per ScaleGrid, questo è descritto nel nostro post SSL precedente), quindi utilizzare sslCA opzione per puntare al percorso di questo file, abilitando così anche la verifica del server.

Mangusta

  • Per cluster autonomi:

    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);
    ...
    
  • Per i cluster di set di repliche:

    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);
    ...

Driver nativo di MongoDB (e wrapper attorno ad esso, come Mongoskin)

  • Per cluster autonomi:

    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();
     });
    
    
  • Per i cluster di set di repliche:

    Il parametro dell'opzione per i set di repliche è 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();
     });
    
    

Disabilitazione della verifica del certificato SSL

Puoi anche disabilitare del tutto la verifica del certificato SSL. Questo è forse più facile da fare e sicuramente funzionerà per te, tuttavia, non è il modo consigliato da percorrere. Il driver MongoDB fornisce opzioni SSL a livello di server e di set di repliche (sslValidate , sslCA , sslCert , sslKey , sslPass ) per configurare le connessioni SSL. Tutte le opzioni sono descritte in dettaglio nella documentazione.

Nel caso di certificati autofirmati, l'opzione più utile è sslValidate . Questo può essere impostato su false in caso di errori come: DEPTH_ZERO_SELF_SIGNED_CERT (certificato autofirmato). Questo disabilita la verifica del certificato SSL ma la connessione rimane comunque crittografata.

Mongoose ti consente di passare i parametri al driver nella sua chiamata di connessione. Ad esempio:

  • Cluster di set di repliche:

    sslValidate deve essere impostato su false all'opzione ReplicaSet quindi:

    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);
    ...
    
  • Per il driver nativo MongoDB:

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

Disabilitazione della verifica del nome host

Invece di disabilitare completamente la convalida SSL, se i nomi host sono un problema, puoi semplicemente disabilitare la verifica del nome host.

La verifica del nome host, come parte della verifica del certificato CA, è attualmente configurabile. Si consiglia sempre di attivare questa verifica. Tuttavia, potrebbe portare a errori di verifica anche se c'è la minima mancata corrispondenza nel nome host, come nel certificato CA rispetto al client che tenta di connettersi. Pertanto, la maggior parte dei server TLS/SSL fornisce un modo per disattivarlo. Per esempio. il driver Java MongoDB 3.0 consente di disabilitare la verifica del nome host tramite sslInvalidHostNameAllowed proprietà. Per MongoDB Native Driver 2.0 e versioni successive, un parametro di opzione booleano checkServerIdentity (predefinito vero ) viene fornito per disabilitare la verifica del nome host. È disponibile sia a livello di singolo server che di set di repliche.