sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB SSL con certificados autofirmados en Node.js

ScaleGrid admite la configuración de SSL para MongoDB y se puede configurar fácilmente como se describe en una publicación anterior. También analiza la necesidad y las ventajas y desventajas de MongoDB con TLS/SSL.

ScaleGrid actualmente usa certificados autofirmados para SSL al crear nodos para un nuevo clúster. Dado que las aplicaciones Node.js sobre el controlador MongoDB Node.js o Mongoose son opciones muy populares en nuestra plataforma, creamos esta publicación para compartir un plan de solución paso a paso para los problemas más comunes al usar MongoDB SSL con autofirmado. certificados en Node.js. Esta discusión se refiere a MongoDB Node.js versión 2.0 y Mongoose versión 4.0.3.

En ScaleGrid, también le brindamos la opción de comprar sus propios certificados SSL y configurarlos en el servidor MongoDB. Envíe un correo electrónico a [email protected] para obtener más información sobre esta oportunidad.

Agregar archivo de certificado de CA

Para mejorar la seguridad de su conexión SSL, puede especificar la CA que se utilizará para validar el certificado SSL del servidor MongoDB. Node.js tiene una lista predeterminada de CA "raíces" conocidas que consulta si no se especifica una CA durante el tiempo de creación de la conexión. Sin embargo, dado que estamos hablando de certificados autofirmados, tendremos que especificar un archivo de certificado de CA para la verificación. Puede copiar el archivo del certificado de CA que se usó para la firma automática en la máquina cliente (para ScaleGrid, esto se describe en nuestra publicación anterior de SSL) y luego usar el sslCA opción para señalar la ruta de este archivo, lo que también permite la verificación del servidor.

Mangosta

  • Para clústeres independientes:

    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);
    ...
    
  • Para clústeres de conjuntos 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);
    ...

Controlador nativo de MongoDB (y envoltorios a su alrededor, como Mongoskin)

  • Para clústeres independientes:

    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();
     });
    
    
  • Para clústeres de conjuntos de réplicas:

    El parámetro de opción para conjuntos de réplicas es 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();
     });
    
    

Deshabilitar la verificación del certificado SSL

También puede deshabilitar la verificación del certificado SSL por completo. Esto es quizás lo más fácil de hacer y lo más seguro es que funcione para usted, sin embargo, no es la forma recomendada de hacerlo. El controlador MongoDB proporciona opciones SSL a nivel de servidor y de conjunto de réplicas (sslValidate , sslCA , sslCert , sslKey , sslPass ) para configurar las conexiones SSL. Todas las opciones se describen en detalle en la documentación.

En el caso de certificados autofirmados, la opción más útil es sslValidate . Esto se puede establecer en false en caso de errores como: DEPTH_ZERO_SELF_SIGNED_CERT (certificado autofirmado). Esto deshabilita la verificación del certificado SSL, pero la conexión aún permanece encriptada.

Mongoose le permite pasar parámetros al controlador en su llamada de conexión. Por ejemplo:

  • Conglomerados de conjuntos de réplicas:

    sslValidate debe establecerse en false en la opción ReplicaSet entonces:

    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);
    ...
    
  • Para el controlador nativo de 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();
     });
    
    

Deshabilitar la verificación del nombre de host

En lugar de deshabilitar por completo la validación SSL, si los nombres de host son un problema, simplemente se puede deshabilitar la verificación de nombre de host.

La verificación del nombre de host, como parte de la verificación del certificado de CA, se puede configurar actualmente. Siempre se recomienda que esta verificación esté activada. Sin embargo, podría provocar fallas en la verificación, incluso si existe la más mínima discrepancia en el nombre de host, como en el certificado de CA frente al cliente que intenta conectarse. Por lo tanto, la mayoría de los servidores TLS/SSL ofrecen una forma de apagarlo. Por ejemplo. el controlador Java MongoDB 3.0 permite una forma de deshabilitar la verificación del nombre de host a través de sslInvalidHostNameAllowed propiedad. Para MongoDB Native Driver 2.0 y superior, un parámetro de opción booleana checkServerIdentity (predeterminado verdadero ) se proporciona para deshabilitar la verificación del nombre de host. Está disponible tanto a nivel de servidor individual como de conjunto de réplicas.