Ответ 1
Примечание: следующее опасно и позволит перехватывать и изменять содержимое API между клиентом и сервером.
Это также сработало
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
Я использую 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
, это почему? Нужно ли запускать на сервере?
Примечание: следующее опасно и позволит перехватывать и изменять содержимое API между клиентом и сервером.
Это также сработало
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
Это не проблема с приложением, но с сертификатом, подписанным промежуточным ЦС. Если вы примете этот факт и хотите продолжить, добавьте следующие параметры запроса:
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);
});
Вместо отключения безопасности вы можете добавить необходимые цепочки в цепочку. Сначала установите пакет 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
Решение 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');
Для приложения Create React (где эта ошибка также возникает, и этот вопрос является результатом # 1 Google), вы, вероятно, используете HTTPS=true npm start
и proxy
(в package.json
), который идет к какому-то HTTPS API, который сам является подписано, когда в разработке.
Если это так, рассмотрите возможность смены proxy
следующим образом:
"proxy": {
"/api": {
"target": "https://localhost:5001",
"secure": false
}
}
secure
решает, проверяет ли прокси-сервер WebPack цепочку сертификатов или нет, и отключает ее, гарантируя, что самозаверяющий сертификат API не будет проверен для получения ваших данных.
Просто поместите это здесь, если это поможет кому-то, мой случай был другим и немного странным микс. Я получал это по запросу, к которому обращался через superagent - проблема не имела ничего общего с сертификатами ( которые были правильно настроены), и все связано с тем, что я передавал суперагентный результат через async обратный вызов водопада модуля. Чтобы исправить: вместо передачи всего результата просто пройдите result.body
через обратный вызов водопада.
У меня были те же проблемы. Я следил за @ThomasReggi и решением @CoolAJ86 и работал хорошо, но я не удовлетворен решением.
Поскольку проблема "UNABLE_TO_VERIFY_LEAF_SIGNATURE" происходит из-за уровня конфигурации сертификации.
Я принимаю решение @thirdender, но его частичное решение. Согласно официальному сайту nginx, они явно упомянули, что сертификат должен быть сочетанием Сертификат сервера и скованные сертификаты.
Может быть очень заманчиво сделать 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
. Затем я открыл этот файл и добавил новую строку после первого сертификата. Вы можете прочитать больше на
У меня возникла проблема с моей конфигурацией Apache после установки сертификата GoDaddy на поддомен. Первоначально я думал, что это может быть проблемой при Node не отправлении индикатора имени сервера (SNI), но это было не так. Анализ сертификата поддомена SSL с помощью https://www.ssllabs.com/ssltest/ вернул ошибку. Проблемы с цепочкой: Неполный.
После добавления файла GoDaddy с gd_bundle-g2-g1.crt
с помощью директивы SSLCertificateChainFile
Apache, Node смог подключиться через HTTPS, и ошибка исчезла.
Положите rejectUnauthorized: false в петиции, и это сработало для меня.
Вы должны включить промежуточный сертификат на вашем сервере. Это решает [Ошибка: UNABLE_TO_VERIFY_LEAF_SIGNATURE]