2017-05-08 80 views
0

我的LDAP連接正常工作,使用node-ldapjs。我正在嘗試使用node-ldapjs實現LDAPS連接。我使用的設置/配置等同於被其他人描述爲成功的解決方案,並在此發佈 - https://github.com/mcavage/node-ldapjs/issues/307。我的代碼如下所示。當我執行下面的代碼,我得到以下信息:NodeJS錯誤消息 - UNABLE_TO_GET_ISSUER_CERT_LOCALLY - 嘗試LDAPS連接

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

以下是完整的堆棧跟蹤 -

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) 

在這我的NodeJS應用程序上運行相同的客戶端計算機,LDAPS結合當我使用LDPApache Directory Studio進行測試時,遠程DC成功。

任何人都可以幫助我確定(1)上面的錯誤消息的根源是什麼,(2)我該如何解決這個問題?

這裏是我的代碼:

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

回答

0

我沒有看到你的目測代碼中的問題。報告的原始錯誤從(Node.js的)openSSL層傳播回來,並且通常是因爲證書無法建立其信任鏈而產生的;在LDAPS環境中,我期望問題是在客戶端驗證服務器證書。

對於自簽名證書,或者更一般地說,如果信任鏈依賴於正確安裝中間證書來完成來自證書頒發機構根的信任(假設沒有過期),則會出現此錯誤。而且,在企業環境中,由於代理/防火牆的存在以及它們(錯誤)的配置,這可能會變得更加複雜。

我建議您將精力集中在診斷/驗證您的證書和依賴性組合到需要建立的安全連接上的可信根CA上。在這方面,其他工具,如curlopenssl工具(以及類似的工具可能會有所幫助)。