MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB SSL z samopodpisanymi certyfikatami w Node.js

ScaleGrid obsługuje konfigurację SSL dla MongoDB i można ją łatwo skonfigurować, jak opisano we wcześniejszym poście. Omówiono również potrzeby oraz zalety i wady MongoDB z TLS/SSL.

ScaleGrid używa obecnie certyfikatów z podpisem własnym dla SSL podczas tworzenia węzłów dla nowego klastra. Ponieważ aplikacje Node.js za pośrednictwem sterownika MongoDB Node.js lub Mongoose są bardzo popularnymi opcjami na naszej platformie, stworzyliśmy ten post, aby udostępnić szczegółowy plan obejścia najczęściej występujących problemów związanych z używaniem MongoDB SSL z podpisem własnym certyfikaty w Node.js. Ta dyskusja dotyczy MongoDB Node.js w wersji 2.0 i Mongoose w wersji 4.0.3.

W ScaleGrid zapewniamy również możliwość zakupu własnych certyfikatów SSL i skonfigurowania ich na serwerze MongoDB. Aby dowiedzieć się więcej o tej możliwości, wyślij e-mail na adres [email protected].

Dodawanie pliku certyfikatu CA

Aby poprawić bezpieczeństwo połączenia SSL, możesz określić CA, który będzie używany do walidacji certyfikatu SSL serwera MongoDB. Node.js ma domyślną listę dobrze znanych „głównych” urzędów certyfikacji, które sprawdza, jeśli urzędy certyfikacji nie zostały określone podczas tworzenia połączenia. Ponieważ jednak mówimy o certyfikatach z podpisem własnym, będziemy musieli określić plik certyfikatu CA do weryfikacji. Możesz skopiować plik certyfikatu CA, który był używany do samopodpisywania się na komputer kliencki (w przypadku ScaleGrid jest to opisane w naszym starszym poście SSL), a następnie użyć sslCA opcja wskazywania ścieżki tego pliku, umożliwiając w ten sposób również weryfikację serwera.

Mongusta

  • Dla klastrów samodzielnych:

    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);
    ...
    
  • Dla klastrów zestawów replik:

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

Natywny sterownik MongoDB (i otacza go, jak Mongoskin)

  • Dla klastrów samodzielnych:

    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();
     });
    
    
  • Dla klastrów zestawów replik:

    Parametrem opcji dla zestawów replik jest 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();
     });
    
    

Wyłączanie weryfikacji certyfikatu SSL

Możesz również całkowicie wyłączyć weryfikację certyfikatu SSL. Jest to prawdopodobnie najłatwiejsze do zrobienia i na pewno zadziała dla Ciebie, jednak nie jest to zalecany sposób. Sterownik MongoDB udostępnia opcje SSL na poziomie serwera i repliki na poziomie zestawu (sslValidate , sslCA , sslCert , sslKey , sslPass ), aby skonfigurować połączenia SSL. Wszystkie opcje są szczegółowo opisane w dokumentacji.

W przypadku certyfikatów samopodpisanych najbardziej użyteczną opcją jest sslValidate . Można to ustawić na false w przypadku błędów takich jak: DEPTH_ZERO_SELF_SIGNED_CERT (certyfikat z podpisem własnym). Wyłącza to weryfikację certyfikatu SSL, ale połączenie nadal pozostaje zaszyfrowane.

Mongoose pozwala przekazać parametry kierowcy w jego połączeniu. Na przykład:

  • Klastry zestawów replik:

    sslValidate musi być ustawiony na false w opcji ReplicaSet, więc:

    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);
    ...
    
  • Dla sterownika macierzystego 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();
     });
    
    

Wyłączanie weryfikacji nazwy hosta

Zamiast całkowicie wyłączać weryfikację SSL, jeśli nazwy hostów stanowią problem, można po prostu wyłączyć weryfikację nazwy hosta.

Weryfikacja nazwy hosta w ramach weryfikacji certyfikatu CA jest obecnie konfigurowalna. Zawsze zaleca się włączenie tej weryfikacji. Może to jednak prowadzić do niepowodzeń weryfikacji, nawet jeśli występuje najmniejsza niezgodność w nazwie hosta, na przykład w certyfikacie CA w porównaniu z klientem próbującym się połączyć. Dlatego większość dostawców serwerów TLS/SSL oferuje sposób na jego wyłączenie. Na przykład. sterownik Java MongoDB 3.0 umożliwia wyłączenie weryfikacji nazwy hosta poprzez sslInvalidHostNameAllowed własność. Dla MongoDB Native Driver 2.0 i nowszych, parametr opcji logicznej checkServerIdentity (domyślnie prawda ) służy do wyłączenia weryfikacji nazwy hosta. Jest dostępny zarówno na poziomie indywidualnego serwera, jak i zestawu replik.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak mogę hostować własny serwer Parse w Heroku przy użyciu MongoDB?

  2. Golang może dostać puste obiekty

  3. Nodejs / Express — uruchamianie mojej aplikacji:express.createServer() jest przestarzałe

  4. Zapytania C# mongo z ciągami json

  5. Błąd krytyczny:nie znaleziono klasy „MongoDB\Driver\Manager”