2017-05-08 5 views
0

Ich habe LDAP-Verbindungen ordnungsgemäß mit node-ldapjs. Ich versuche LDAPS-Verbindungen mit node-ldapjs zu implementieren. Die Einrichtung/Konfiguration, die ich verwende, entspricht der Lösung, die von einer anderen Person als erfolgreich beschrieben wurde und hier veröffentlicht wurde - https://github.com/mcavage/node-ldapjs/issues/307. Mein Code ist unten gezeigt. Wenn ich den Code ausführen, bekomme ich die folgende Meldung:NodeJS-Fehlermeldung - UNABLE_TO_GET_ISSUER_CERT_LOCALLY - LDAPS-Verbindung versuchen

{[Error: unable to get local issuer certificate] code: 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY'}

Hier ist die vollständige Stacktrace -

Error: unable to get local issuer certificate 
    at Error (native) 
    at TLSSocket.<anonymous> (_tls_wrap.js:1022:38) 
    at emitNone (events.js:67:13) 
    at TLSSocket.emit (events.js:166:7) 
    at TLSSocket._init.ssl.onclienthello.ssl.oncertcb.TLSSocket._finishInit (_tls_wrap.js:586:8) 
    at TLSWrap.TLSSocket._init.ssl.onclienthello.ssl.oncertcb.ssl.onnewsession.ssl.onhandshakedone (_tls_wrap.js:428:38) 

auf demselben Client-Computer, die meine NodeJS App auf läuft, LDAPS bindet zum entfernten DC sind erfolgreich, wenn ich mit LDP oder Apache Directory Studio teste.

Kann mir jemand helfen zu bestimmen (1) was ist die Ursache der Fehlermeldung oben und (2) wie kann ich dieses Problem beheben?

Hier ist mein Code:

var fs = require('fs'); 
var tls = require('tls'); 
var ldap = require('ldapjs'); 

var tlsOptions = { 
host: 'FQDN', 
cert: fs.readFileSync('mycert.pem'), 
ca: fs.readFileSync('my-root-CA.cer'), 
rejectUnauthorized: true 
}; 

var server = tls.connect(636,tlsOptions,function() { 
console.log('tls connect'); 
console.log('client connected', server.authorized ? 'authorized' : 'unauthorized'); 
process.stdin.resume(); 
process.stdin.pipe(server); 

    if (server.authorized) 
    { 
      var client = ldap.createClient({url: 'ldaps://domainControllerIP:636',tlsOptions:tlsOptions}); 
      client.bind(username, password, function (err) { 
      cb(err === null, err); 
      }); 
      //Perform LDAP search operation 
      var opts = { 
      filter: '(&(objectclass=organizationalRole))', 
      scope: 'sub', 
      attributes: ['cn'] 
      }; 

      client.search('dc=domain,dc=local', opts, function(err, res) { 
      res.on('searchEntry', function(entry) { 
          console.log('entry: ' + JSON.stringify(entry.object)); 
      }); 
      res.on('searchReference', function(referral) { 
          console.log('referral: ' + referral.uris.join()); 
      }); 
      res.on('error', function(err) { 
         console.error('error: ' + err.message); 
      }); 
      res.on('end', function(result) { 
         console.log('status: ' + result.status); 
      }); 
     }); 
    } 
}); 
server.setEncoding('utf8'); 
server.on('data',function(data){ 
console.log('data section: ',data); 
}); 

server.on('secureConnect',function(data){ 
console.log('secure connect section: ',data); 
}); 

server.on('error', function(error) { 
console.log('client closing...',error); 
}); 

Antwort

0

Ich sehe kein Problem Ihr Code Anglotzen. Der rohe Fehler, wie er gemeldet wird, wird von der Ebene openSSL (von Node.js) zurückgespielt und tritt in der Regel auf, weil das Zertifikat seine Vertrauenskette nicht einrichten kann. In einem LDAPS-Kontext würde ich erwarten, dass das Problem das Serverzertifikat auf Client-Seite überprüft.

Dieser Fehler kann bei selbstsignierten Zertifikaten auftreten, oder allgemeiner, wenn die Vertrauenskette von der korrekten Installation von Zwischenzertifikaten zur Vervollständigung der Vertrauensstellung von einer Zertifizierungsstellenstammstelle abhängt (vorausgesetzt, dass nichts abgelaufen ist). In einer Unternehmensumgebung kann dies durch das Vorhandensein von Proxies/Firewalls und deren (Fehl-) Konfiguration noch komplizierter werden.

Ich würde vorschlagen, dass Sie sich auf die Diagnose/Validierung der Kombination Ihrer Zertifikate und Abhängigkeiten mit den vertrauenswürdigen Stammzertifizierungsstellen entlang der zu erstellenden sicheren Verbindungen konzentrieren. In dieser Hinsicht können andere Werkzeuge, wie zum Beispiel curl oder openssl Werkzeuge (und ähnliche können hilfreich sein).