NodeJS 错误消息 - UNABLE_TO_GET_ISSUER_CERT_LOCALLY - 尝试 LDAPS 连接
NodeJS error message - UNABLE_TO_GET_ISSUER_CERT_LOCALLY - attempting LDAPS connection
我的 LDAP 连接与 node-ldapjs. I am trying to implement LDAPS connections with node-ldapjs. The setup/configuration I am using is equivalent to the solution which was described as being successful by another individual and was posted here - https://github.com/mcavage/node-ldapjs/issues/307 正常工作。我的代码如下所示。当我执行下面的代码时,我收到以下消息:
{[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 应用 运行 所在的同一台客户端计算机上,当我使用 LDP or Apache Directory Studio 进行测试时,LDAPS 绑定到远程 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);
});
我没有看到你的代码有问题。报告的原始错误从 openSSL
层(Node.js 层)向上传播,通常是因为证书无法建立其信任链;在 LDAPS 上下文中,我预计问题是在客户端验证服务器证书。
自签名证书可能会出现此错误,或者更普遍的情况是,如果信任链依赖于正确安装中间证书来完成来自证书颁发机构根的信任(假设没有任何内容已过期)。而且,在企业环境中,proxies/firewalls 及其(错误)配置的存在会使这变得更加复杂。
我建议您将精力集中在 diagnosing/validating 将您的证书和对受信任的根 CA 的依赖项与需要建立的安全连接相结合。在这方面,其他工具,例如 curl
或 openssl
工具(以及类似的工具可能会有所帮助)。
我的 LDAP 连接与 node-ldapjs. I am trying to implement LDAPS connections with node-ldapjs. The setup/configuration I am using is equivalent to the solution which was described as being successful by another individual and was posted here - https://github.com/mcavage/node-ldapjs/issues/307 正常工作。我的代码如下所示。当我执行下面的代码时,我收到以下消息:
{[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 应用 运行 所在的同一台客户端计算机上,当我使用 LDP or Apache Directory Studio 进行测试时,LDAPS 绑定到远程 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);
});
我没有看到你的代码有问题。报告的原始错误从 openSSL
层(Node.js 层)向上传播,通常是因为证书无法建立其信任链;在 LDAPS 上下文中,我预计问题是在客户端验证服务器证书。
自签名证书可能会出现此错误,或者更普遍的情况是,如果信任链依赖于正确安装中间证书来完成来自证书颁发机构根的信任(假设没有任何内容已过期)。而且,在企业环境中,proxies/firewalls 及其(错误)配置的存在会使这变得更加复杂。
我建议您将精力集中在 diagnosing/validating 将您的证书和对受信任的根 CA 的依赖项与需要建立的安全连接相结合。在这方面,其他工具,例如 curl
或 openssl
工具(以及类似的工具可能会有所帮助)。