sql >> Database >  >> NoSQL >> MongoDB

Verbinding maken met MongoDB via SSL met Node.js

Stap 1:verkrijg MongoDB 3.0

Het eerste dat u moet weten, is dat SSL alleen out-of-the-box wordt ondersteund door MongoDB 3.0 en hoger. Ubuntu heeft geen 3.0 in de standaard repositories, dus hier is hoe je het krijgt:

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 is vanaf nu de nieuwste stabiele versie, maar voel je vrij om 3.0.7 te vervangen door je favoriete release.

Stap 2:Verkrijg privésleutel, certificaat en PEM-bestanden

De PEM bevat een Public Key Certificaat en de bijbehorende Private Key. Deze bestanden kunnen ofwel worden verkregen met IRL-dollars van een Certificaatautoriteit of als volgt worden gegenereerd met OpenSSL:

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 wordt gebruikt als het PEM-bestand, mongodb-cert.key is het privésleutelbestand en mongodb-cert.crt is het certificaatbestand dat ook als CA-bestand kan worden gebruikt. JE HEBT DEZE ALLE DRIE NODIG.

Stap 3:MongoD configureren

We gaan ervan uit dat je deze bestanden hebt gekopieerd naar je /etc/ssl/ map waar ze thuishoren. Nu openen we ons MongoDB-configuratiebestand:

sudo vi /etc/mongod.conf

en wijzig de sectie "# netwerkinterfaces" als volgt:

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

LET OP :we geven commentaar op bindIp . DIT STAAT EXTERNE VERBINDINGEN TOE om toegang te krijgen tot uw Mongo-database. We gaan ervan uit dat dit uw einddoel is (Waarom zou u verkeer op localhost versleutelen? ), maar u moet dit alleen doen NA HET INSTELLEN VAN AUTORISATIEREGELS voor uw MongoDB-server.

Het CAFile wordt ook becommentarieerd omdat het optioneel is. Ik zal aan het einde van dit bericht uitleggen hoe u het vertrouwen van de certificeringsinstantie kunt instellen.

Zoals altijd moet u MongoDB opnieuw opstarten voordat de wijzigingen in het configuratiebestand van kracht worden:

sudo service mongod restart

IS UW SERVER NIET GESTART? U staat er alleen voor, maar er is waarschijnlijk een probleem met uw certificaatbestanden. U kunt opstartfouten controleren door mongod . uit te voeren handmatig:

sudo mongod --config /etc/mongod.conf

Stap 4:Test uw serverinstellingen

Voordat we gaan knoeien met Node-configuraties, laten we ervoor zorgen dat uw serverconfiguratie correct werkt door verbinding te maken met de mongo opdrachtregelclient:

mongo --ssl --sslAllowInvalidHostnames --sslAllowInvalidCertificates

Tenzij de domeinnaam op uw certificaat 127.0.0.1 . is of localhost , de --sslAllowInvalidHostnames vlag is noodzakelijk. Zonder dit krijg je waarschijnlijk deze foutmelding:

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

Stap 5:Configureer Node.JS / Mongoose

Als u de node-mongodb-native . gebruikt pakket in uw Node-toepassing, stop dan onmiddellijk en begin Mongoose te gebruiken. Het is niet zo moeilijk. Dat gezegd hebbende, mongoose.connect() heeft vrijwel dezelfde API als mongodb.connect() , dus vervang het op de juiste manier.

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

Stap 6:[Optioneel] verifieer uw certificaten via een certificeringsinstantie

Om uw SSL-certificaten te valideren, moet u een CA (of bundel) verkrijgen ) bestand van uw certificeringsinstantie. Dit lijkt veel op uw certificaatbestand, maar bevat vaak meerdere certificaten (die een vertrouwensketen vormen om te controleren of een certificaat geldig is ). Als u een zelfondertekend certificaat gebruikt, kunt u uw mongodb-cert.crt gebruiken als een CA-bestand.

U moet er ook voor zorgen dat de hostnaam van uw MongoDB-server overeenkomt met de naam die is gebruikt om het certificaat te maken.

Stap 6.3:Update je mongod configuratie

sudo vi /etc/mongod.conf

en wijzig de sectie "# netwerkinterfaces" als volgt:

# 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

Stap 6.4:Test uw serverinstellingen

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

Mongo-clients kunnen ook het CA-bestand doorgeven om te controleren of ze met de juiste server praten. Dit wordt gedaan met de --sslCAFile parameter

Mongo-servers die zijn geconfigureerd met een CAFile, vereisen dat klanten een geldig certificaat hebben EN de privésleutel voor de server. In de mongo shell-client wordt dit gedaan door de --sslPEMKeyFile parameter.

Zonder een PEM-bestand (dat het servercertificaat bevat ), ziet u mogelijk deze fout:

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

De server kan worden geconfigureerd om verzoeken van clients zonder PEM-bestand te accepteren door net.ssl.weakCertificateValidation in te schakelen , maar u verzwakt uw beveiliging zonder echt voordeel.

Stap 6.5:Node.JS / Mongoose configureren

Er zijn hier een paar problemen, dus geduld met me.

Eerst MOET je node-mongodb-native . hebben 2.0 of later. Als je Mongoose gebruikt, dan heb je Mongoose 4.0 nodig of later. Eerdere Mongoose-versies gebruiken node-mongodb-native 1.* die op geen enkele manier certificaatvalidatie ondersteunt.

Ten tweede is er geen sslAllowInvalidHostnames of vergelijkbare optie beschikbaar in node-mongodb-native. Dit is niet iets dat node-mongodb-native ontwikkelaars kunnen repareren (Ik zou nu hebben ) omdat de native TLS-bibliotheek die beschikbaar is in Node 0.10.* hiervoor geen optie biedt. In Node 4.* en 5.* is er een checkServerIdentity optie die hoop biedt, maar het overschakelen van de oorspronkelijke Node-branch naar de branch na de io.js-samenvoeging kan momenteel wat hoofdpijn veroorzaken.

Dus laten we dit proberen:

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

Als u hostnaam/IP-mismatch-fouten krijgt, repareer dan uw certificaat of negeer al dit harde werk door sslValidate uit te schakelen :

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

Bron



  1. Index laten vallen met Mongoose

  2. Redis:som van SCORES in gesorteerde set

  3. MongoDB databaseschema-ontwerp

  4. Zoeken in mongo db met behulp van mangoest regex vs. tekst