MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

SSL MongoDB avec certificats auto-signés dans Node.js

ScaleGrid prend en charge la configuration SSL pour MongoDB et peut être facilement configuré comme indiqué dans un article précédent. Il traite également des besoins et des avantages et inconvénients de MongoDB avec TLS/SSL.

ScaleGrid utilise actuellement des certificats auto-signés pour SSL lors de la création de nœuds pour un nouveau cluster. Étant donné que les applications Node.js sur le pilote MongoDB Node.js ou Mongoose sont des choix très populaires sur notre plate-forme, nous avons créé cet article pour partager un plan de contournement étape par étape pour les problèmes les plus couramment rencontrés lors de l'utilisation de MongoDB SSL avec auto-signé. certificats dans Node.js. Cette discussion concerne MongoDB Node.js version 2.0 et Mongoose version 4.0.3.

Chez ScaleGrid, nous vous offrons également la possibilité d'acheter vos propres certificats SSL et de les configurer sur le serveur MongoDB. Veuillez envoyer un e-mail à [email protected] pour en savoir plus sur cette opportunité.

Ajout d'un fichier de certificat CA

Afin d'améliorer la sécurité de votre connexion SSL, vous pouvez spécifier l'AC à utiliser pour valider le certificat SSL du serveur MongoDB. Node.js a une liste par défaut d'autorités de certification "racines" bien connues qu'il consulte si une autorité de certification n'est pas spécifiée lors de la création de la connexion. Cependant, puisque nous parlons de certificats auto-signés, nous devrons spécifier un fichier de certificat CA pour vérification. Vous pouvez copier le fichier de certificat CA qui a été utilisé pour l'auto-signature sur la machine cliente (pour ScaleGrid, ceci est décrit dans notre ancien article SSL), puis utiliser le sslCA option pour pointer vers le chemin de ce fichier, permettant ainsi également la vérification du serveur.

Mangouste

  • Pour les clusters autonomes :

    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);
    ...
    
  • Pour les clusters d'ensembles de réplicas :

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

Pilote natif MongoDB (et wrappers autour, comme Mongoskin)

  • Pour les clusters autonomes :

    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();
     });
    
    
  • Pour les clusters d'ensembles de réplicas :

    Le paramètre d'option pour les jeux de répliques est 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();
     });
    
    

Désactiver la vérification du certificat SSL

Vous pouvez également désactiver complètement la vérification du certificat SSL. C'est peut-être le plus facile à faire et le plus sûr de travailler pour vous, cependant, ce n'est pas la méthode recommandée. Le pilote MongoDB fournit des options SSL au niveau du serveur et au niveau de l'ensemble de répliques (sslValidate , sslCA , sslCert , sslKey , sslPass ) pour configurer les connexions SSL. Toutes les options sont décrites en détail dans la documentation.

Dans le cas des certificats auto-signés, l'option la plus utile est le sslValidate . Cela peut être défini sur false en cas d'erreurs telles que : DEPTH_ZERO_SELF_SIGNED_CERT (certificat auto-signé). Cela désactive la vérification du certificat SSL mais la connexion reste cryptée.

Mongoose vous permet de transmettre des paramètres au conducteur dans son appel de connexion. Par exemple :

  • Clusters d'ensembles de réplicas :

    sslValidate doit être défini sur false à l'option ReplicaSet donc :

    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);
    ...
    
  • Pour le pilote natif 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();
     });
    
    

Désactivation de la vérification du nom d'hôte

Au lieu de désactiver complètement la validation SSL, si les noms d'hôte posent problème, il suffit de désactiver la vérification du nom d'hôte.

La vérification du nom d'hôte, dans le cadre de la vérification du certificat CA, est actuellement configurable. Il est toujours recommandé d'activer cette vérification. Cependant, cela peut entraîner des échecs de vérification même s'il y a la moindre incohérence dans le nom d'hôte, comme dans le certificat CA par rapport au client qui tente de se connecter. Ainsi, la plupart des serveurs TLS/SSL fournissent un moyen de le désactiver. Par example. le pilote Java MongoDB 3.0 permet de désactiver la vérification du nom d'hôte via le sslInvalidHostNameAllowed biens. Pour MongoDB Native Driver 2.0 et supérieur, un paramètre d'option booléen checkServerIdentity (par défaut true ) est fourni pour désactiver la vérification du nom d'hôte. Il est disponible à la fois au niveau du serveur individuel et du jeu de répliques.