Collegamento a MongoDB su SSL con Node.js

Come posso collegare un MongoDB-server su SSL utilizzando Node.js?

Ho letto le fonti di alcuni driver (mongojs, mongodb-nativo) e sono stato googling un po ‘ ormai, ma non riesco a trovare un proprio tutorial, guide o documenti.

  • Il 2 ° risultato per mongodb ssl node.js potrebbero interessarti mongodb.github.io/node-mongodb-native/api-generated/server.html
  • Hm.. ho iniziato a scherzare, ma non funziona. Farò una nuova prova.
  • E il moderatore che ha votato per chiudere: davvero? Come non è, questo, sulla programmazione? Cerchiamo solo di non scrivere codice che si connette al database di poi.
  • Possibile duplicato di MongoDb e nodejs SSl/Connessione Sicura
  • Di sicuro è un duplicato quando l’altra domanda che è stato chiesto più tardi… Stupido di me per la pubblicazione di una nuova domanda quando stava per essere chiesto 7 mesi dopo da qualcun altro! 🙂
InformationsquelleAutor Jakob | 2014-06-24

 

3 Replies
  1. 11

    Fase 1: Ottenere MongoDB 3.0

    La prima cosa che dovete sapere è che SSL è supportato solo out-of-the-box in MongoDB 3.0 e versioni successive. Ubuntu non hanno 3.0, nel default dei repository, quindi, ecco come si ottiene:

    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 è l’ultima versione stabile, per ora, ma sentitevi liberi di sostituire 3.0.7 con la vostra versione preferita.

    Passo 2: Ottenere la Chiave Privata del Certificato, e i file PEM

    PEM contiene un Certificato di Chiave Pubblica e Chiave Privata associata. Questi file possono essere ottenuti con IRL dollari da un Certificato Authroity o generati con OpenSSL in questo modo:

    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 sarà utilizzato come file PEM, mongodb-cert.la chiave è il file con la Chiave Privata, e mongodb-cert.crt è Certificato file che può essere utilizzato anche come file CA. AVRETE BISOGNO DI TUTTI E TRE DI QUESTI.

    Passo 3: Configurazione MongoD

    Supponiamo che hai copiato i file /etc/ssl/cartella a cui appartengono. Ora apriamo il nostro MongoDB file di configurazione:

    sudo vi /etc/mongod.conf

    e modificare il “# interfacce di rete” sezione in questo modo:

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

    Si PREGA di NOTARE: siamo commentando bindIp. QUESTO PERMETTE CONNESSIONI ESTERNE per accedere al tuo Mongo database. Si assume che questo è il tuo obiettivo finale (Perché sarebbe il vostro crittografare il traffico su localhost?), ma si dovrebbe farlo solo DOPO che l’IMPOSTAZIONE di REGOLE di AUTORIZZAZIONE per il tuo MongoDB server.

    Il CAFile è anche commentato quanto è opzionale. Vi spiegherò come impostare Autorità di certificazione fiducia al termine di questo post.

    Come sempre, è necessario riavviare MongoDB prima config file modifiche avranno effetto:

    sudo service mongod restart

    FATTO IL SERVER NON SI AVVIA? Si è soli, ma probabilmente c’è un problema con i file di certificato. È possibile controllare start-up errori eseguendo mongod manualmente:

    sudo mongod --config /etc/mongod.conf

    Fase 4: verifica le impostazioni del server di

    Prima di andare a fare scherzi con il Nodo configurazioni, assicurarsi che il server di configurazione funziona correttamente collegando con il mongo client a linea di comando:

    mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

    A meno che il nome di dominio per il tuo certificato è 127.0.0.1 o localhost, –sslAllowInvalidHostnames bandiera è necessario. Senza di essa, si avrà probabilmente ottenere questo errore:

    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

    Punto 5) Configurare Node.JS /Mongoose

    Se si sta utilizzando il nodo-mongodb-pacchetto nativo nel Nodo di applicazione, interrompere immediatamente e iniziare a utilizzare Mangusta. Non è così difficile. Detto questo, la mangusta.connect() ha praticamente la stessa API come mongodb.connect(), in modo da sostituire in modo appropriato.

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

    Punto 6) [Facoltativo] verificare i Certificati tramite un Attestato di Autorità

    Al fine di convalidare i Certificati SSL, è necessario ottenere una CA (o bundle) file dall’Autorità di certificazione. Questo avrà un aspetto un po ‘ come il file del Certificato, ma spesso contengono più Certificati (che forma acatena di fiducia per verificare che il certificato sia valido). Se si utilizza un certificato autofirmato, è possibile utilizzare il mongodb-cert.crt come un file CA.

    È necessario anche garantire che il vostro MongoDB hostname del server corrisponda a quella utilizzata per creare il certificato.

    Passo 6.3) Aggiorna il tuo mongod configurazione

    sudo vi /etc/mongod.conf

    e modificare il “# interfacce di rete” sezione in questo modo:

    # 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

    Passo 6.4) Verificare le impostazioni del server

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

    Mongo i Clienti possono passare i file CA verificare che stanno comunicando con il server corretto. Questo viene fatto con l’ –sslCAFile parametro

    Mongo Server configurato con un CAFile richiedono che i clienti in possesso di un valido Certificato E la Chiave Privata del server. In mongo shell client, questo è fatto passando il –sslPEMKeyFile parametro.

    Senza un file PEM (che contiene anche il Certificato del server), si potrebbe essere visualizzato questo messaggio di errore:

    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

    Il server può essere configurato per accettare le richieste dei clienti senza un file PEM, consentendo netto.ssl.weakCertificateValidation, ma sarà indebolimento di sicurezza per nessun guadagno reale.

    Passo 6.5) Configurare Node.JS /Mongoose

    Ci sono un paio di trucchi qui, in modo da portare con me.

    Prima, è NECESSARIO disporre di nodo-mongodb-nativo 2.0 o versione successiva. Se si utilizza Mangusta, allora avete BISOGNO di Mangusta 4.0 o versioni successive. Precedente Mongoose versioni nodo-mongodb-nativa di 1.* che non supporta la convalida del Certificato in qualsiasi veste.

    In secondo luogo, non c’è sslAllowInvalidHostnames o simile opzione disponibile nel nodo-mongodb-native. Questo non è qualcosa che il nodo-mongodb-nativi, gli sviluppatori possono fissare (sarebbe ora), perché il nativo TLS libreria disponibile nel Nodo 0.10.* non offre alcuna opzione per questo. In 4 Nodo.* e 5.*, c’è un checkServerIdentity opzione che offre speranza, ma il passaggio dal Nodo originale ramo per ramo dopo l’io.js unione può causare un po ‘ di mal di testa al momento attuale.

    Allora proviamo questo:

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

    Se sono sempre hostname/IP errori di mancata corrispondenza, correggere il certificato, o negare tutto questo duro lavoro disattivando 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')
          }
        }
      ;

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

    • Vedi il mio commento sul tuo duplica risposta. Stesso vale qui.
    • Risposta impressionante, grazie mille per la procedura dettagliata!
  2. 5

    Come suggerito nei commenti, il node-mongodb-native ha tutto il necessario.

    L’ho preso su e in esecuzione utilizzando il seguente:

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

    Modifica

    Si può anche fare ssl da mangusta:

    mongoose.createConnection(connString, { server: { ssl: true }})
    • perché non sslCA,sslCert e sslKey non specificato?
  3. 4

    Se si desidera eseguire l’autenticazione tramite certificato, utilizzando 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();
    });

Lascia un commento