MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB SSL mit selbstsignierten Zertifikaten in Node.js

ScaleGrid unterstützt die SSL-Konfiguration für MongoDB und kann einfach eingerichtet werden, wie in einem früheren Beitrag beschrieben. Außerdem werden die Notwendigkeit sowie die Vor- und Nachteile von MongoDB mit TLS/SSL erörtert.

ScaleGrid verwendet derzeit selbstsignierte Zertifikate für SSL, wenn Knoten für einen neuen Cluster erstellt werden. Da Node.js-Anwendungen über den MongoDB-Node.js-Treiber oder Mongoose sehr beliebte Optionen auf unserer Plattform sind, haben wir diesen Beitrag erstellt, um einen schrittweisen Workaround-Plan für die am häufigsten auftretenden Probleme bei der Verwendung von MongoDB-SSL mit selbstsigniertem zu teilen Zertifikate in Node.js. Diese Diskussion bezieht sich auf MongoDB Node.js Version 2.0 und Mongoose Version 4.0.3.

Bei ScaleGrid bieten wir Ihnen auch die Möglichkeit, Ihre eigenen SSL-Zertifikate zu erwerben und sie auf dem MongoDB-Server zu konfigurieren. Bitte senden Sie eine E-Mail an [email protected] um mehr über diese Möglichkeit zu erfahren.

CA-Zertifikatsdatei hinzufügen

Um die Sicherheit Ihrer SSL-Verbindung zu verbessern, können Sie die CA angeben, die zur Validierung des SSL-Zertifikats des MongoDB-Servers verwendet werden soll. Node.js verfügt über eine Standardliste bekannter „Root“-CAs, die es konsultiert, wenn während der Verbindungserstellungszeit keine CA angegeben wird. Da es sich jedoch um selbstsignierte Zertifikate handelt, müssen wir eine CA-Zertifikatsdatei zur Überprüfung angeben. Sie können die CA-Zertifikatsdatei, die für die Selbstanmeldung verwendet wurde, auf den Clientcomputer kopieren (für ScaleGrid wird dies in unserem älteren SSL-Beitrag beschrieben) und dann sslCA verwenden Option, auf den Pfad dieser Datei zu verweisen, wodurch auch die Serverüberprüfung aktiviert wird.

Mungo

  • Für eigenständige Cluster:

    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 Replikat-Set-Cluster:

    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 (und Wrapper darum, wie Mongoskin)

  • Für eigenständige Cluster:

    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 Replikat-Set-Cluster:

    Der Optionsparameter für Replikatsätze ist 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();
     });
    
    

Verifizierung des SSL-Zertifikats deaktivieren

Sie können die SSL-Zertifikatsüberprüfung auch vollständig deaktivieren. Dies ist vielleicht am einfachsten und funktioniert am sichersten für Sie, es ist jedoch nicht der empfohlene Weg. Der MongoDB-Treiber bietet SSL-Optionen auf Serverebene und Replikatsatzebene (sslValidate , sslCA , sslCert , sslKey , sslPass ), um SSL-Verbindungen zu konfigurieren. Alle Optionen sind in der Dokumentation ausführlich beschrieben.

Im Fall von selbstsignierten Zertifikaten ist die nützlichste Option sslValidate . Dies kann auf false gesetzt werden bei Fehlern wie: DEPTH_ZERO_SELF_SIGNED_CERT (selbst signiertes Zertifikat). Dadurch wird die SSL-Zertifikatsüberprüfung deaktiviert, aber die Verbindung bleibt weiterhin verschlüsselt.

Mit Mongoose können Sie Parameter in seinem Verbindungsaufruf an den Treiber weitergeben. Beispiel:

  • Replikatsatz-Cluster:

    sslValidate muss auf false gesetzt werden bei der ReplicaSet-Option so:

    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 den nativen MongoDB-Treiber:

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

Verifizierung des Hostnamens deaktivieren

Anstatt die SSL-Validierung vollständig zu deaktivieren, kann man, wenn Hostnamen ein Problem darstellen, einfach die Überprüfung des Hostnamens deaktivieren.

Die Überprüfung des Hostnamens als Teil der Überprüfung des CA-Zertifikats ist derzeit konfigurierbar. Es wird immer empfohlen, diese Überprüfung zu aktivieren. Es kann jedoch zu Überprüfungsfehlern führen, selbst wenn der Hostname auch nur die geringste Abweichung aufweist, wie im CA-Zertifikat und dem Client, der versucht, eine Verbindung herzustellen. Daher bieten die meisten TLS/SSL-Server eine Möglichkeit, es auszuschalten. Zum Beispiel. Der Java MongoDB-Treiber 3.0 ermöglicht die Deaktivierung der Überprüfung des Hostnamens über sslInvalidHostNameAllowed Eigentum. Für MongoDB Native Driver 2.0 und höher ein boolescher Optionsparameter checkServerIdentity (Voreinstellung true ) wird bereitgestellt, um die Überprüfung des Hostnamens zu deaktivieren. Es ist sowohl auf der Ebene einzelner Server als auch auf Replikat-Set-Ebenen verfügbar.