Ответ 1
Добавьте это в начало файла:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
ОПАСНОЕ. Это отключает проверку HTTPS/SSL/TLS во всей вашей среде node.js. См. Решение, используя https-агент ниже.
Я использую запрос Mikeal (https://github.com/mikeal/request), чтобы сделать запрос https на сервер. Тем не менее, я продолжаю получать авторизационную ошибку CERT_HAS_EXPIRED.
request({
url: 'https://www.domain.com/api/endpoint',
strictSSL: false
}, function(error, response, body) {
if(!error && response.statusCode == 200) {
res.json(JSON.parse(body));
} else {
res.json(response.statusCode, {'error': 'error'})
}
});
Я пробовал установить strictSSL на true и false, оба выдают такую же ошибку CERT_HAS_EXPIRED. Что вызывает эту проблему и есть ли способ ее исправить в nodejs?
Добавьте это в начало файла:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
ОПАСНОЕ. Это отключает проверку HTTPS/SSL/TLS во всей вашей среде node.js. См. Решение, используя https-агент ниже.
Обновите сертификат. Это можно сделать бесплатно, используя Greenlock, который выдает сертификаты через Let's Encrypt ™ v2
'use strict';
var request = require('request');
var agentOptions;
var agent;
agentOptions = {
host: 'www.example.com'
, port: '443'
, path: '/'
, rejectUnauthorized: false
};
agent = new https.Agent(agentOptions);
request({
url: "https://www.example.com/api/endpoint"
, method: 'GET'
, agent: agent
}, function (err, resp, body) {
// ...
});
Используя agent
с rejectUnauthorized
вы, по крайней мере, ограничиваете уязвимость безопасности запросами, связанными с этим одним сайтом, а не полностью обрабатываете весь процесс узла, совершенно небезопасным.
Если вы использовали самозаверяющий сертификат, вы бы добавили этот параметр:
agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];
Для подключений с надежным одноранговым соединением вы также можете добавить эти два варианта:
agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;
Это печально, что process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
даже документировано. Его следует использовать только для отладки и никогда не следует вводить в виде кода, который работает в дикой природе. Почти каждая библиотека, которая работает на https
имеет способ передачи опций агента. Те, которые этого не делают, должны быть исправлены.
Вот более краткий способ достижения "менее небезопасного" метода, предложенного CoolAJ86.
request({
url: url,
agentOptions: {
rejectUnauthorized: false
}
}, function (err, resp, body) {
// ...
});
Я думаю, что strictSSL: false
должен (должен был работать, даже в 2013 году) работать. Короче говоря, это три возможных способа:
request
: const myRequest = require('request').defaults({strictSSL: false})
node-request
внутренне, также позволяют вводить request
-объект, поэтому вы можете заставить их использовать модифицированный экземпляр.NODE_TLS_REJECT_UNAUTHORIZED=0
для процесса Node.js.Попробуйте временно изменить request.js и harcode везде rejectUnauthorized = true, но лучше было бы получить сертификат расширенным как долгосрочное решение.