Сообщение об ошибке NodeJS - UNABLE_TO_GET_ISSUER_CERT_LOCALLY - попытка подключения LDAPS

У меня есть соединения LDAP, работающие правильно с node-ldapjs. Я пытаюсь реализовать соединения LDAPS с node-ldapjs. Настройка / конфигурация, которую я использую, эквивалентна решению, которое было описано как успешное другим человеком и было размещено здесь - 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, LDAPS связывается с удаленным DC успешно, когда я тестирую с LDP или Apache Directory Studio.

Может ли кто-нибудь помочь мне определить (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);
});

1 ответ

Решение

Я не вижу проблем с просмотром вашего кода. Необработанная ошибка, о которой сообщается, распространяется обратно из openSSL уровень (из Node.js), и обычно возникает потому, что сертификат не может установить свою цепочку доверия; в контексте LDAPS я ожидаю, что проблема заключалась в проверке сертификата сервера на стороне клиента.

Эта ошибка может возникать с самозаверяющими сертификатами или, в более общем случае, если цепочка доверия зависит от правильной установки промежуточных сертификатов для завершения доверия от корня центра сертификации (при условии, что срок действия сертификата не истек). И в корпоративной среде это может осложниться еще и наличием прокси / брандмауэров и их (неправильной) конфигурацией.

Я бы посоветовал вам сосредоточить свои усилия на диагностике / проверке комбинации ваших сертификатов и зависимостей с доверенными корневыми центрами сертификации вдоль безопасных соединений, которые необходимо установить. В связи с этим другие инструменты, такие как curl или же openssl инструменты (и аналогичные могут быть полезны).

Другие вопросы по тегам