¿Cómo me puedo conectar a un MongoDB-servidor a través de SSL utilizando Node.js?

He leído las fuentes de un par de conductores (mongojs, mongodb-nativo) y he estado googleando un rato, pero parece que no puede encontrar cualquier tutoriales, guías o documentos.

  • El 2º resultado para mongodb ssl node.js que podrían interesarle, mongodb.github.io/node-mongodb-native/api-generated/server.html
  • Hm.. empecé a trastear con eso, pero no consigo que funcione. Voy a darle un nuevo intento.
  • Y el moderador que votaron a cerca de: ¿de verdad? Cómo es esto de la programación? Deje nunca de escribir código que se conecta a las bases de datos, a continuación,.
  • Posibles duplicados de MongoDb y nodejs SSl/Conexión Segura
  • Seguro que es un duplicado cuando la otra pregunta se le preguntó más tarde… Estúpido de mí por la publicación de una nueva pregunta cuando se va a pedir a los 7 meses más tarde por alguien más! 🙂
InformationsquelleAutor Jakob | 2014-06-24

3 Comentarios

  1. 11

    Paso 1: Obtener MongoDB 3.0

    La primera cosa que usted necesita saber es que el SSL es compatible sólo fuera-de-la-caja de MongoDB 3.0 y posterior. Ubuntu no tiene 3.0 por defecto en los repositorios, así que aquí está cómo usted lo consigue:

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
    echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
    sudo apt-get update
    sudo apt-get install -y mongodb-org=3.0.7 mongodb-org-server=3.0.7 mongodb-org-shell=3.0.7 mongodb-org-mongos=3.0.7 mongodb-org-tools=3.0.7

    3.0.7 es la última versión estable como la de ahora, pero se sienten libres para sustituir 3.0.7 con su favorito de la liberación.

    Paso 2: Obtener la Clave Privada del Certificado, y los archivos PEM

    El PEM contiene una Clave Pública del Certificado y su Clave Privada asociada. Estos archivos se pueden obtener con IRL dólares de un Certificado de Authroity o generados con OpenSSL así:

    openssl req -newkey rsa:2048 -new -x509 -days 3650 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
    cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

    mongodb.pem será utilizado como el PEM archivo, mongodb-cert.la clave es el archivo de Clave Privada, y mongodb-cert.crt es un archivo de Certificado que también puede ser utilizado como el archivo de CA. USTED TENDRÁ TODOS LOS TRES DE ESTOS.

    Paso 3: Configurar MongoD

    Vamos a asumir que copiar estos archivos a su /etc/ssl/carpeta donde pertenecen. Ahora abrimos nuestro MongoDB archivo de configuración:

    sudo vi /etc/mongod.conf

    y modificar el «# interfaces de red» de la sección así:

    # network interfaces
    net:
      port: 27017
      #bindIp: 127.0.0.1
      ssl:
        mode: allowSSL
        PEMKeyFile: /etc/ssl/mongodb.pem
        #CAFile: /etc/ssl/mongodb-cert.crt

    Por FAVOR tenga en cuenta: estamos comentando bindIp. ESTO PERMITE que las CONEXIONES EXTERNAS para acceder a su base de datos Mongo. Suponemos que este es su objetivo final (¿por Qué su cifrar el tráfico en localhost?), pero sólo se debe hacer esto DESPUÉS de configurar las REGLAS de AUTORIZACIÓN para su servidor de MongoDB.

    La CAFile también es comentada, ya que es opcional. Voy a explicar cómo configurar el Certificado de la Autoridad de confianza al final de este post.

    Como siempre, usted debe reiniciar MongoDB antes de archivo de configuración de cambios tomará efecto:

    sudo service mongod restart

    HIZO SU SERVIDOR NO SE INICIA? Usted está en sus el propio, pero probablemente hay un problema con los archivos de certificado. Puede comprobar el inicio de los errores mediante la ejecución de mongod manualmente:

    sudo mongod --config /etc/mongod.conf

    Paso 4: Probar la configuración del servidor de

    Antes de ir a jugar con las configuraciones de Nodo de, vamos a asegurarnos de que su servidor de instalación está funcionando correctamente mediante la conexión con el mongo cliente de línea de comandos:

    mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

    A menos que el nombre de dominio en su certificado es 127.0.0.1 o localhost, el –sslAllowInvalidHostnames bandera es necesario. Sin ella, probablemente obtendrá este error:

    E NETWORK  The server certificate does not match the host name 127.0.0.1
    E QUERY    Error: socket exception [CONNECT_ERROR] for 
        at connect (src/mongo/shell/mongo.js:179:14)
        at (connect):1:6 at src/mongo/shell/mongo.js:179
    exception: connect failed

    Paso 5) Configurar Node.JS /Mangosta

    Si usted está utilizando el nodo-mongodb-paquete nativo en su Nodo de la aplicación, pare inmediatamente y empezar a utilizar la Mangosta. No es tan difícil. Dicho esto, la mangosta.connect() tiene prácticamente la misma API como mongodb.connect(), para sustituir adecuadamente.

        var fs = require('fs')
          , mongoose = require('mongoose')
          , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
          , mongoOpt = {
              "sslValidate": false,
              "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
              "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt')
            }
          ;
    
    mongoose.connect(mongoUri, mongoOpt);

    Paso 6) [Opcionalmente] verificar sus Certificados a través de un Certificado de la Autoridad de

    Con el fin de validar sus Certificados SSL, usted necesita para obtener una CA (o paquete) archivo de su Certificado de Autoridad. Este aspecto muy similar al de su archivo de Certificado, pero a menudo contienen varios Certificados (que forma achain de confianza para verificar que el certificado es válido). Si usted está usando un certificado auto-firmado, usted puede utilizar su mongodb-cert.crt como un archivo de CA.

    Usted también necesita asegurarse de que su MongoDB nombre de host del servidor coincide con el utilizado para crear el certificado.

    Paso 6.3) Actualización de su mongod configuración

    sudo vi /etc/mongod.conf

    y modificar el «# interfaces de red» de la sección así:

    # network interfaces net:   port: 27017   #bindIp: 127.0.0.1   ssl:
        mode: allowSSL
        PEMKeyFile: /etc/ssl/mongodb.pem
        CAFile: /etc/ssl/mongodb-ca.crt
    
    sudo service mongod restart

    Paso 6.4) Prueba de la configuración del servidor

    mongo --ssl --sslAllowInvalidHostnames --sslCAFile /etc/ssl/mongodb-ca.crt --sslPEMKeyFile /etc/ssl/mongodb.pem

    Mongo Clientes puede pasar en el archivo de CA así como para verificar que están hablando con el servidor correcto. Esto se hace con el –sslCAFile parámetro

    Mongo Servidores configurados con un CAFile requieren que los clientes poseen un Certificado Y la Clave Privada del servidor. En el mongo shell cliente, esto se hace pasando en el –sslPEMKeyFile parámetro.

    Sin un PEM (archivo que contiene el Certificado del servidor), puede ver este error:

    I NETWORK  DBClientCursor::init call() failed
    E QUERY    Error: DBClientBase::findN: transport error: 127.0.0.1:27017 ns: admin.$cmd query: { whatsmyuri: 1 }
        at connect (src/mongo/shell/mongo.js:179:14)
        at (connect):1:6 at src/mongo/shell/mongo.js:179
    exception: connect failed

    El servidor puede ser configurado para aceptar las solicitudes de los clientes sin un PEM de archivo mediante la habilitación de la red.ssl.weakCertificateValidation, pero usted será el debilitamiento de su seguridad para ninguna ganancia real.

    Paso 6.5) Configurar Node.JS /Mangosta

    Hay un par de errores aquí, así que tengan paciencia conmigo.

    Primer lugar, usted NECESITA tener el nodo-mongodb-nativo 2.0 o posterior. Si usted está utilizando la Mangosta, entonces usted NECESITA Mangosta 4.0 o posterior. Anterior Mangosta versiones nodo de uso-mongodb-nativo 1.* que no admite la validación de Certificados en cualquier capacidad que sea.

    En segundo lugar, no hay sslAllowInvalidHostnames o similar disponible en el nodo-mongodb-nativo. Esto no es algo que nodo-mongodb-nativos, los desarrolladores pueden arreglar (yo tendría por ahora) porque el nativo TLS biblioteca disponible en el Nodo 0.10.* no ofrece ninguna opción para ello. En El Nodo 4.* y 5.*, hay un checkServerIdentity opción que ofrece la esperanza, pero el cambio de la original Nodo de la rama de la rama después de la io.js la mezcla puede causar un poco de dolor de cabeza en el momento actual.

    Así que vamos a intentarlo:

    var fs = require('fs')
      , mongoose = require('mongoose')
      , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
      , mongoOpt = {
          "server": { 
            "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
            "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
            "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
          }
        }
      ;

    Si usted está recibiendo el nombre de host/IP desajuste de los errores, corregir su certificado, o negar todo este trabajo duro mediante la desactivación de sslValidate:

    var fs = require('fs')
      , mongoose = require('mongoose')
      , mongoUri = "mongodb://127.0.0.1:27017?ssl=true"
      , mongoOpt = {
          "server": {
            "sslValidate": false,
            "sslKey": fs.readFileSync('/etc/ssl/mongodb.pem'),
            "sslCert": fs.readFileSync('/etc/ssl/mongodb-cert.crt'),
            "sslCa": fs.readFileSync('/etc/ssl/mongodb-ca.crt')
          }
        }
      ;

    Fuente:
    http://www.bainweb.com/2015/11/connecting-to-mongodb-over-tlsssl-with.html

    • Ver mi comentario en tu duplicar respuesta. Mismo se aplica aquí.
    • Impresionante respuesta, muchas gracias por la muy detallada de los pasos!
  2. 5

    Como se sugiere en los comentarios, la node-mongodb-native tiene todo lo necesario.

    Lo tengo funcionando con la siguiente:

    var mongo = require('mongodb');
    
    var server = new mongo.Server('HOSTNAME', 27017, { ssl: true });
    var db = new mongo.Db('NAME_OF_MY_DB', server, { w: 1 });
    var auth = { user: 'USERNAME', pass: 'PASSWORD' };
    
    db.open(function(err, db) {
      if (err) return console.log("error opening", err);
    
      db.authenticate(auth.user, auth.pass, function(err, result) {
        if (err) return console.log("error authenticating", err);
    
        console.log("authed?", result);
    
        db.collection('whatever').count(function(err, count) {
          if (err) return console.log("error counting", err);
    
          console.log("count", count);
          db.close()
        });
      });
    });

    Editar

    También puede hacer ssl de mangosta:

    mongoose.createConnection(connString, { server: { ssl: true }})
    • ¿por qué no sslCA,sslCert y sslKey no especificado?
  3. 4

    Si desea autenticarse mediante un certificado, utilizando node-mongodb-native:

    var buffer = require('fs').readFileSync("mongodb.pem");
    var MongoClient = require('mongodb').MongoClient;
    MongoClient.connect("mongodb://hostname:27017/test?ssl=true", {
        sslKey: buffer,
        sslCert: buffer,
        sslValidate: false //in case of self-generated certificate
    }, function(err, db) {
        console.log(err);
        console.log(db);
        db.close();
    });

Dejar respuesta

Please enter your comment!
Please enter your name here