Node.js Ошибка HTTPS 400 - 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' - PullRequest
9 голосов
/ 25 февраля 2012

Я пишу приложение Node.js, которое должно запрашивать некоторые данные у одного из наших внутренних API. Сложность в том, что сервер, с которого я запрашиваю данные, имеет определенные ограничения:

  • Запрос должен быть сделан по протоколу HTTPS (не HTTP)
  • Запрос должен быть сделан с использованием IP-адреса локальной сети, поскольку доменное имя не будет работать внутри
  • Похоже, что запрос запрашивается с внешнего имени домена, потому что именно для этого настроен виртуальный хост.

Для этого я запускаю немного кода, который выглядит следующим образом:

var headers = {
    Host: externalHostname,
    Hostname: externalHostname,
};

var options = {
    host: InternalIP,
    path: path,
    method: 'GET',
    headers: headers
};

var req = https.request(options, function(res) {
    res.setEncoding('utf8');

    var data = "";

    res.on('data', function(chunk) {
        data += chunk;
    });

    res.on('end', function() {
        //Do something with that data
    });

    res.on('error', function(err) {
            console.log("Error during HTTP request");
            console.log(err);
    });
});

req.end();

К сожалению, в ответ я получаю ошибку 400 (ваш браузер отправил запрос, который не может понять этот сервер). Я дважды и трижды проверял, что имя хоста, ip-адрес и имя пути все верны (я могу проверить их из моего браузера, и все хорошо).

Я вывел свою переменную ответа (res) и получаю значение authorizationError UNABLE_TO_VERIFY_LEAF_SIGNATURE. Я не уверен, что это такое, или это моя проблема, но это единственная полезная информация, которую я смог найти.

Я поместил полный вывод моей переменной ответа здесь .

Есть идеи, что может быть причиной этого?

Обновление: Я разобрался! Я пытался пройти проверку подлинности на сервере, передав переменную ?PHPSESSID=asdad GET, но они отключили это. Я смог заставить его работать, установив PHPSESSID в заголовке Cookie.

Ответы [ 5 ]

14 голосов
/ 20 ноября 2013

установить это process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

1 голос
/ 01 апреля 2015

Я нажал здесь во время отладки ошибки UNABLE_TO_VERIFY_LEAF_SIGNATURE во внешнем вызове API с моего сервера nodejs.

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

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

В моем случае произошла глупая ошибка, и запрос направлялся к самому localhost.Даже после того, как было сказано выше, запрос не прошел, и это помогло мне обнаружить ошибку.

Сказав это, не рекомендуется использовать это как решение.Скорее выясните, как вы можете предоставить дополнительные сертификаты, установив параметры agent:false & ca:[fs.readFileSync('root-cert.pem')]. https.request документация содержит подробности.В погоне за моей ошибкой я также обнаружил еще несколько полезных ресурсов:

  1. Сайт ssl-tools.net предоставляет корневые и промежуточные сертификаты.Например: Baltimore CyberTrust Root , используемый live.api.net
  2. Модуль ssl-root-cas заявляет о предоставлении дополнительных сертификатов CA, используемых в популярных браузерах.Я не подтвердил претензию.
  3. openssl s_client -connect apis.live.net:443 - печатает цепочку сертификатов.вам нужно заменить последний параметр (url & port) тем, к чему вы подключаетесь.
0 голосов
/ 10 апреля 2014

Попробуйте это в командной строке:

npm config set strict-ssl false

Это сработало для меня на Mac.

0 голосов
/ 05 марта 2014

Установить это process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; Исправлена ​​проблема UNABLE_TO_VERIFY_LEAF_SIGNATURE для суперагента.

0 голосов
/ 25 февраля 2012

проверьте это из источника tls.js в последнем node.js (я думаю, вам нужно гораздо больше)

// AUTHENTICATION MODES
//
// There are several levels of authentication that TLS/SSL supports.
// Read more about this in "man SSL_set_verify".
//
// 1. The server sends a certificate to the client but does not request a
// cert from the client. This is common for most HTTPS servers. The browser
// can verify the identity of the server, but the server does not know who
// the client is. Authenticating the client is usually done over HTTP using
// login boxes and cookies and stuff.
//
// 2. The server sends a cert to the client and requests that the client
// also send it a cert. The client knows who the server is and the server is
// requesting the client also identify themselves. There are several
// outcomes:
//
//   A) verifyError returns null meaning the client's certificate is signed
//   by one of the server's CAs. The server know's the client idenity now
//   and the client is authorized.
//
//   B) For some reason the client's certificate is not acceptable -
//   verifyError returns a string indicating the problem. The server can
//   either (i) reject the client or (ii) allow the client to connect as an
//   unauthorized connection.
//
// The mode is controlled by two boolean variables.
//
// requestCert
//   If true the server requests a certificate from client connections. For
//   the common HTTPS case, users will want this to be false, which is what
//   it defaults to.
//
// rejectUnauthorized
//   If true clients whose certificates are invalid for any reason will not
//   be allowed to make connections. If false, they will simply be marked as
//   unauthorized but secure communication will continue. By default this is
//   false.
//

установите для параметра rejectUnauthorized значение false и скрестите пальцы ... дайте мне знать, если выходные данные изменятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...