Не удалось проверить подпись листа

Я использую node.js request.js для достижения API. Я получаю эту ошибку

[Ошибка: UNABLE_TO_VERIFY_LEAF_SIGNATURE]

Все мои учетные данные точны и действительны, а сервер в порядке. Я сделал тот же запрос с почтальоном.

request({
    "url": domain+"/api/orders/originator/"+id,
    "method": "GET",
    "headers":{
        "X-API-VERSION": 1,
        "X-API-KEY": key
    },
}, function(err, response, body){
    console.log(err);
    console.log(response);
    console.log(body);
});

Этот код просто выполняется в исполняемом скрипте ex. node./run_file.js, это почему? Нужно ли запускать на сервере?

Ответ 1

Примечание: следующее опасно и позволит перехватывать и изменять содержимое API между клиентом и сервером.

Это также сработало

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

Ответ 2

Это не проблема с приложением, но с сертификатом, подписанным промежуточным ЦС. Если вы примете этот факт и хотите продолжить, добавьте следующие параметры запроса:

rejectUnauthorized: false

Полный запрос:

request({
    "rejectUnauthorized": false,
    "url": domain+"/api/orders/originator/"+id,
    "method": "GET",
    "headers":{
        "X-API-VERSION": 1,
        "X-API-KEY": key
    },
}, function(err, response, body){
    console.log(err);
    console.log(response);
    console.log(body);
});

Ответ 3

Безопасное решение

Вместо отключения безопасности вы можете добавить необходимые цепочки в цепочку. Сначала установите пакет ssl-root-cas из npm:

npm install ssl-root-cas

Этот пакет содержит много промежуточных сертификатов, которым доверяют браузеры, а узлам - нет.

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()

Добавит недостающие сертификаты. Смотрите здесь для получения дополнительной информации:

https://git.coolaj86.com/coolaj86/ssl-root-cas.js

Также смотрите следующий ответ ниже

Ответ 4

Решение CoolAJ86 является правильным, и оно не снижает вашу безопасность, как отключение всех проверок с помощью rejectUnauthorized или NODE_TLS_REJECT_UNAUTHORIZED. Тем не менее, вам может потребоваться ввести дополнительный сертификат CA явно.

Я попробовал сначала корневые ЦС, включенные в модуль ssl-root-cas:

require('ssl-root-cas/latest')
  .inject();

Я все еще закончил с ошибкой UNABLE_TO_VERIFY_LEAF_SIGNATURE. Затем я узнал, кто выдал сертификат для веб-сайта, с которым я подключался COMODO SSL Analyzer, загрузил сертификат этого органа и попытался добавить только тот:

require('ssl-root-cas/latest')
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

Я закончил с другой ошибкой: CERT_UNTRUSTED. Наконец, я ввел дополнительные корневые ЦС и включил "мой" (очевидно, посреднический) СА, который работал:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

Ответ 5

Для приложения Create React (где эта ошибка также возникает, и этот вопрос является результатом # 1 Google), вы, вероятно, используете HTTPS=true npm start и proxypackage.json), который идет к какому-то HTTPS API, который сам является подписано, когда в разработке.

Если это так, рассмотрите возможность смены proxy следующим образом:

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}

secure решает, проверяет ли прокси-сервер WebPack цепочку сертификатов или нет, и отключает ее, гарантируя, что самозаверяющий сертификат API не будет проверен для получения ваших данных.

Ответ 6

Просто поместите это здесь, если это поможет кому-то, мой случай был другим и немного странным микс. Я получал это по запросу, к которому обращался через superagent - проблема не имела ничего общего с сертификатами ( которые были правильно настроены), и все связано с тем, что я передавал суперагентный результат через async обратный вызов водопада модуля. Чтобы исправить: вместо передачи всего результата просто пройдите result.body через обратный вызов водопада.

Ответ 7

У меня были те же проблемы. Я следил за @ThomasReggi и решением @CoolAJ86 и работал хорошо, но я не удовлетворен решением.

Поскольку проблема "UNABLE_TO_VERIFY_LEAF_SIGNATURE" происходит из-за уровня конфигурации сертификации.

Я принимаю решение @thirdender, но его частичное решение. Согласно официальному сайту nginx, они явно упомянули, что сертификат должен быть сочетанием Сертификат сервера и скованные сертификаты.

введите описание изображения здесь

Ответ 8

Может быть очень заманчиво сделать rejectUnauthorized: false или process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';, но не делайте этого! Это подвергает вас воздействию человека в середине атаки.

Другие ответы верны в том, что проблема заключается в том, что ваш сертификат "подписан посредником CA". Для этого есть простое решение, которое не требует сторонней библиотеки, такой как ssl-root-cas, или введения каких-либо дополнительных CA в узел.

Большинство клиентов https в узле поддерживают параметры, которые позволяют вам указать ЦС для каждого запроса, что разрешит UNABLE_TO_VERIFY_LEAF_SIGNATURE. Вот простой пример использования модуля встроенного узла https.

import https from 'https';

const options = {
  host: '<your host>',
  defaultPort: 443,
  path: '<your path>',
  // assuming the bundle file is co-located with this file
  ca: readFileSync(__dirname + '/<your bundle file>.ca-bundle'),
  headers: {
    'content-type': 'application/json',
  }
};
https.get(options, res => {
  // do whatever you need to do
})

Однако, если вы можете настроить параметры ssl на своем хостинг-сервере, лучшим решением будет добавление промежуточных сертификатов вашему хостинг-провайдеру. Таким образом, клиентский запросчик не должен указывать CA, поскольку он включен в сам сервер. Я лично использую namecheap + heroku. Уловка для меня заключалась в том, чтобы создать один файл .crt с cat yourcertificate.crt bundle.ca-bundle > server.crt. Затем я открыл этот файл и добавил новую строку после первого сертификата. Вы можете прочитать больше на

https://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl

Ответ 9

У меня возникла проблема с моей конфигурацией Apache после установки сертификата GoDaddy на поддомен. Первоначально я думал, что это может быть проблемой при Node не отправлении индикатора имени сервера (SNI), но это было не так. Анализ сертификата поддомена SSL с помощью https://www.ssllabs.com/ssltest/ вернул ошибку. Проблемы с цепочкой: Неполный.

После добавления файла GoDaddy с gd_bundle-g2-g1.crt с помощью директивы SSLCertificateChainFile Apache, Node смог подключиться через HTTPS, и ошибка исчезла.

Ответ 10

Положите rejectUnauthorized: false в петиции, и это сработало для меня.

Ответ 11

Вы должны включить промежуточный сертификат на вашем сервере. Это решает [Ошибка: UNABLE_TO_VERIFY_LEAF_SIGNATURE]