Node.js запрос CERT_HAS_EXPIRED

Я использую запрос 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?

Ответ 1

Добавьте это в начало файла:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

ОПАСНОЕ. Это отключает проверку HTTPS/SSL/TLS во всей вашей среде node.js. См. Решение, используя https-агент ниже.

Ответ 2

Лучший способ исправить это:

Обновите сертификат. Это можно сделать бесплатно, используя 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 имеет способ передачи опций агента. Те, которые этого не делают, должны быть исправлены.

Ответ 3

Вот более краткий способ достижения "менее небезопасного" метода, предложенного CoolAJ86.

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});

Ответ 4

Я думаю, что strictSSL: false должен (должен был работать, даже в 2013 году) работать. Короче говоря, это три возможных способа:

  • (очевидно) Получите ваш центр сертификации, чтобы обновить сертификат и разместить его на своем сервере!
  • Измените настройки по умолчанию вашего объекта request:

    const myRequest = require('request').defaults({strictSSL: false})

    Многие модули, которые используют node-request внутренне, также позволяют вводить request -объект, поэтому вы можете заставить их использовать модифицированный экземпляр.
  • (не рекомендуется) Переопределить сертификат all для проверки соединений all HTTP (S) агента, установив переменную окружения NODE_TLS_REJECT_UNAUTHORIZED=0 для процесса Node.js.

Ответ 5

Попробуйте временно изменить request.js и harcode везде rejectUnauthorized = true, но лучше было бы получить сертификат расширенным как долгосрочное решение.