Получение ошибки CERT_UNTRUSTED при выполнении HTTPS-запроса на стороне сервера в приложении Node.JS?

Мое приложение Node.JS / Express выдает следующую ошибку при попытке HTTPS-запроса GET с моего серверного кода на API, обслуживаемый другим сервером (другая компания, сервер, не принадлежащий нам):

CERT_UNTRUSTED

ПРИМЕЧАНИЕ. Я запускаю эти тесты из своего компьютера с Linux, используя домен localhost.

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

http://www.hacksparrow.com/node-js-https-ssl-certificate.html

Однако я все равно получаю сообщение об ошибке. (Боковое примечание: поскольку я создал сервер с ключами SSL, загруженными с помощью модуля HTTPS, сервер теперь отвечает только на запросы URL HTTPS (https: //). Сервер больше не отвечает на запросы, отличные от HTTPS, так как я его настроил для загрузки моих файлов SSL PEM при создании сервера. Как ни странно, он печатает два запроса «прослушивание сервера на порте», когда он использовал для печати только один).

Как я могу это исправить?

ПРИМЕЧАНИЕ. Свойство имени хоста в объекте options в приведенном ниже коде было изменено на «фиктивный» URL-адрес, поскольку он является конфиденциальным. Если вы попробуете URL-адрес, вы получите сообщение об ошибке.

Отрывки из кода:

var https = require('https');
https.globalAgent.options.secureProtocol = 'SSLv3_method';

var httpsOptions = {
    hostname: dummyHostName,
    port: 80,
    method: 'GET',
    path: '/search?text=test',
    headers: {
        // Request JSON response.
        'Content-Type': 'application/json',
        'Upgrade-Insecure-Requests': '1',
        'json': 'true'
    }};

   var httpsReq =
        https.request(httpsOptions,
            function (resHttp) {
                //  This block is never reached due to the error.
            }  

Я попытался установить пакет NPM ssl-root-cas согласно этому документу:

https://github.com/coolaj86/node-ssl-root-cas

Но я не мог понять, какие файлы PEM мне нужно было загрузить в разделе ИСПОЛЬЗОВАНИЕ в инструкциях, которые показывают фиктивные имена файлов, поэтому я не думаю, что использую их должным образом.

Вот мой список пакетов для приложения:

├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └─┬ [email protected]
│   ├── [email protected]
│   └─┬ [email protected]
│     └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │   └── [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │   ├── [email protected]
│ │   └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └─┬ [email protected]
│ │   └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │   └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └─┬ [email protected]
│ │   ├─┬ [email protected]
│ │   │ └── [email protected]
│ │   └─┬ [email protected]
│ │     └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │   ├── [email protected]
│ │   ├─┬ [email protected]
│ │   │ ├─┬ [email protected]
│ │   │ │ ├─┬ [email protected]
│ │   │ │ │ ├─┬ [email protected]
│ │   │ │ │ │ └── [email protected]
│ │   │ │ │ ├── [email protected]
│ │   │ │ │ └── [email protected]
│ │   │ │ └── [email protected]
│ │   │ ├─┬ [email protected]
│ │   │ │ └─┬ [email protected]
│ │   │ │   ├─┬ [email protected]
│ │   │ │   │ └── [email protected]
│ │   │ │   ├── [email protected]
│ │   │ │   └── [email protected]
│ │   │ └── [email protected]
│ │   ├── [email protected]
│ │   └── [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│   ├── [email protected]
│   └─┬ [email protected]
│     └── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ └── [email protected]
└─┬ [email protected]
  ├── [email protected]
  └─┬ [email protected]
    ├── [email protected]
    ├── [email protected]
    ├─┬ [email protected]
    │ └─┬ [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   └── [email protected]
    ├── [email protected]
    ├─┬ [email protected]
    │ └── [email protected]
    ├── [email protected]
    ├── [email protected]
    ├─┬ [email protected]
    │ └─┬ [email protected]
    │   └── [email protected]
    ├─┬ [email protected]
    │ ├─┬ [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ └── [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ └── [email protected]
    │ │ └── [email protected]
    │ ├─┬ [email protected]
    │ │ └── [email protected]
    │ ├─┬ [email protected]
    │ │ ├── [email protected]
    │ │ ├─┬ [email protected]
    │ │ │ └── [email protected]
    │ │ ├── [email protected]
    │ │ └── [email protected]
    │ └─┬ [email protected]
    │   └── [email protected]
    ├─┬ [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ ├── [email protected]
    │ └── [email protected]
    ├─┬ [email protected]
    │ ├── [email protected]
    │ ├─┬ [email protected]
    │ │ ├── [email protected]
    │ │ ├── [email protected]
    │ │ └── [email protected]
    │ └─┬ [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├─┬ [email protected]
    │   │ └── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   ├── [email protected]
    │   └── [email protected]
    ├── [email protected]
    ├── [email protected]
    ├── [email protected]
    ├─┬ [email protected]
    │ └── [email protected]
    ├── [email protected]
    ├── [email protected]
    ├── [email protected]
    ├── [email protected]
    ├── [email protected]
    └── [email protected]


person Robert Oschler    schedule 06.09.2016    source источник
comment
Я попробовал шаги, описанные в этой статье, чтобы создать самозаверяющий временный сертификат, просто чтобы обойти эту проблему ... - Вы не предоставили сертификат сервера. Я также не вижу, где UA доверяет вашему ЦС. Также см. Как подписать запрос на подпись сертификата в своем центре сертификации и Как создать самозаверяющий сертификат с помощью openssl? Он предоставляет много справочной информации о сертификатах сервера X.509 и о том, откуда берутся различные правила.   -  person jww    schedule 06.09.2016
comment
... в приведенном ниже коде был изменен на фиктивный URL-адрес, поскольку он является конфиденциальным - Я понимаю ... Вы повесили коробку на Интернет, чтобы все могли взорвать ее; но вы скрыли от нас URL-адрес, когда просили о помощи. Это правильно?   -  person jww    schedule 06.09.2016
comment
@jww - re: первый комментарий. Я использовал шаги, описанные в статье о hacksparrow, на которую я ссылался, для создания файлов PEM для моего самозаверяющего сертификата. re: второй комментарий: Вы повесили коробку .... Нет, не повесили. Как я сказал в своем сообщении, я общаюсь с иностранным сервером API, принадлежащим внешней компании, а не нам.   -  person Robert Oschler    schedule 06.09.2016


Ответы (1)


Если у вас есть сервер, который использует самоподписанный сертификат (или домен сервера не такой, как определено в URL-адресе), то он просто шифрует данные, но не идентифицирует себя. Вот почему node.js выдаст ошибку в этом запросе, но если вы хотите проигнорировать эту проблему (что в основном из вашего вопроса, это то, что я понимаю), вы можете передать следующее свойство в свои httpsOptions:

rejectUnauthorized=false

См. Дополнительную информацию по адресу:

https://nodejs.org/api/https.html#https_https_request_options_call

person sagie    schedule 06.09.2016
comment
rejectUnauthorized=false звучит так же плохо, как VERIFY_PEER_NONE. Не лучше ли исправить основную проблему? - person jww; 06.09.2016
comment
не всегда возможно исправить. например, внутренние приложения внутри организации могут не иметь действительного сертификата. серверы тестирования могут не иметь действительных сертификатов, соответствующих их домену. и так далее ... это не так просто исправить, а иногда и возможно, когда вы работаете с организациями, а операторы действительно не делают того, что вы хотите. - person sagie; 06.09.2016
comment
он вызывает api, развернутый на другом сервере. этот другой сертификат сервера настроен неправильно (либо самоподписанный, либо домен не соответствует сертификату или так далее ...), поэтому он не должен действительно исправлять проблему на своей стороне, только игнорируйте ее, потому что проблема на самом деле не в его конец. проблема должна быть исправлена ​​на том другом сервере api, который не находится под его контролем, насколько я понял. - person sagie; 06.09.2016
comment
@sagie - Я знаю об этом параметре, но, как указано в статье о hacksparrow и других, это делает ваш сервер уязвимым и считается плохой практикой. Как я сказал в своем сообщении, Chrome может правильно взаимодействовать с внешним сервером API, я бы подумал, что смог бы сделать то же самое, если бы у меня была правильная конфигурация. - person Robert Oschler; 06.09.2016
comment
чем я должен спросить, является ли этот сервер api сторонним лицом за пределами сети вашей компании? ваш сервер работает через прокси, а ваш компьютер - нет? этот прокси выполняет перехват ssl? есть много переменных, которые могут повлиять на это. если это тестовый сервер, я предлагаю запустить его с этим флагом и отключить его в продакшене через NODE_ENV = production / development value - person sagie; 06.09.2016
comment
@sagie - 1) Да, сервер api является сторонним лицом за пределами сети вашей компании. 2) Мой сервер, работающий на localhost, не проходит через прокси. Указываете ли вы, что если бы мой сервер работал на общедоступном сервере (т. Е. Не на локальном хосте), он бы работал? Если да, то почему Chrome может получить доступ к серверу api, а мое приложение Node.js, работающее локально, не может? Разве это не указывает на проблему с цепочкой сертификатов? - person Robert Oschler; 06.09.2016
comment
Я полагал, что вы тестируете сторонний тестовый сервер, у которого может не быть действующего сертификата, и в продукте вы будете работать с другим сервером с действующим сертификатом. Кроме того, клиентские сертификаты используются сервером для аутентификации клиентов, которые подключаются к нему, поэтому не думайте, что это проблема с сертификатом клиента, но ваш сервер и ваш хром выходят в сеть по-разному (у вас есть прокси, который может что-то делать в пути вроде перехват ssl) имеет значение. вы также можете посмотреть сертификат в Chrome, когда будете туда перемещаться. это действительно? что об этом говорит хром. - person sagie; 07.09.2016