Я использую 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
, Вот почему? Нужно ли запускать на сервере?
javascript
node.js
ssl
request
ThomasReggi
источник
источник
Ответы:
Примечание : следующее опасно и позволит перехватить и изменить содержимое API между клиентом и сервером.
Это тоже сработало
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
источник
nodemailer
иnodemailer-smtp-transport
работала та же общая команда. Вам нужно добавить это к своемуcreateTransport
объекту:tls:{rejectUnauthorized: false}
Проблема не в приложении, а в сертификате, подписанном промежуточным ЦС. Если вы согласны с этим фактом и все же хотите продолжить, добавьте в параметры запроса следующее:
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:
Этот пакет содержит множество промежуточных сертификатов, которым доверяют браузеры, но не node.
var sslRootCAs = require('ssl-root-cas/latest') sslRootCAs.inject()
Добавлю недостающие сертификаты. См. Здесь для получения дополнительной информации:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Также см. Следующий ответ ниже
источник
ca
массив. Я не знаю, будет ли его http-модуль также обращаться к цепочке ОС. Однако curl в OS X, похоже, использует только цепочку ОС и не позволяет вручную указывать сертификаты.Решение 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');
источник
.cer
запуск, это,openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
чтобы преобразовать его.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 не будет проверен, чтобы вы получили свои данные.источник
Это может быть очень заманчиво сделать
rejectUnauthorized: false
илиprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
, но не делайте этого! Он подвергает вас атаке человека в середине.Другие ответы верны, поскольку проблема заключается в том, что ваш сертификат «подписан промежуточным центром сертификации». Для этого есть простое решение, которое не требует сторонней библиотеки, например
ssl-root-cas
добавление каких-либо дополнительных центров сертификации в узел.Большинство 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 на своем хостинг-сервере, лучшим решением будет добавить промежуточные сертификаты к вашему хостинг-провайдеру. Таким образом, инициатору запроса клиента не нужно указывать ЦС, поскольку он включен в сам сервер. Я лично использую 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
источник
Просто поместите это здесь на случай, если это кому-то поможет, мой случай был другим и немного странным. Я получал это по запросу, к которому обращались через суперагента - проблема не имела ничего общего с сертификатами (которые были настроены правильно), а все из-за того, что я затем передавал результат суперагента через обратный вызов водопада асинхронного модуля. Чтобы исправить: вместо того, чтобы передавать весь результат, просто передайте
result.body
обратный вызов водопада.источник
У меня были такие же проблемы. Я следил за решениями @ThomasReggi и @ CoolAJ86 и работал хорошо, но я не удовлетворен решением.
Поскольку проблема «UNABLE_TO_VERIFY_LEAF_SIGNATURE» возникает из-за уровня конфигурации сертификации.
Я принимаю решение @thirdender, но его частичное решение. Согласно официальному сайту nginx , они четко упомянули, что сертификат должен быть комбинацией сертификата сервера и связанных сертификатов.
источник
Вы также можете попробовать, установив strictSSL к
false
, как это:{ url: "https://...", method: "POST", headers: { "Content-Type": "application/json"}, strictSSL: false }
источник
У меня возникла проблема с конфигурацией Apache после установки сертификата GoDaddy на поддомене. Первоначально я думал, что это может быть проблема с узлом, который не отправляет индикатор имени сервера (SNI), но это было не так. Анализ SSL-сертификата субдомена с https://www.ssllabs.com/ssltest/ вернул ошибку Цепочка вопросов: Неполный .
После добавления
gd_bundle-g2-g1.crt
файла, предоставленного GoDaddy с помощьюSSLCertificateChainFile
директивы Apache, Node смог подключиться через HTTPS, и ошибка исчезла.источник
Вы должны включить промежуточный сертификат на свой сервер. Это решает [Ошибка: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
источник
Другой подход к безопасному решению этой проблемы - использовать следующий модуль.
node_extra_ca_certs_mozilla_bundle
Этот модуль может работать без каких-либо изменений кода, создавая файл PEM, который включает все корневые и промежуточные сертификаты, которым доверяет Mozilla. Вы можете использовать следующую переменную среды (работает с Nodejs v7.3 +),
NODE_EXTRA_CA_CERTS
Чтобы создать файл PEM для использования с указанной выше переменной среды. Вы можете установить модуль, используя:
а затем запустите сценарий узла с переменной среды.
Другие способы использования сгенерированного файла PEM доступны по адресу:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
ПРИМЕЧАНИЕ: я являюсь автором вышеуказанного модуля.
источник
Если вы зашли в эту ветку, потому что используете модуль node postgres / pg, есть лучшее решение, чем установка
NODE_TLS_REJECT_UNAUTHORIZED
илиrejectUnauthorized
, что приведет к небезопасным соединениям.Вместо этого настройте параметр «ssl» в соответствии с параметрами для tls.connect :
{ ca: fs.readFileSync('/path/to/server-ca.pem').toString(), cert: fs.readFileSync('/path/to/client-cert.pem').toString(), key: fs.readFileSync('/path/to/client-key.pem').toString(), servername: 'my-server-name' // e.g. my-project-id/my-sql-instance-id for Google SQL }
Я написал модуль для помощи при разборе этих параметров от переменных окружения , как
PGSSLROOTCERT
,PGSSLCERT
иPGSSLKEY
:https://github.com/programmarchy/pg-ssl
источник
У меня работали следующие команды:
> npm config set strict-ssl false > npm cache clean --force
Проблема в том, что вы пытаетесь установить модуль из репозитория с плохим или ненадежным сертификатом SSL [Secure Sockets Layer]. Как только вы очистите кеш, эта проблема будет решена. Возможно, позже вам потребуется изменить его значение на true.
источник