NODE_TLS_REJECT_UNAUTHORIZED Приложение Heroku делает все приложение небезопасным - PullRequest
0 голосов
/ 18 июня 2020

У меня есть приложение на Heroku, которое использует платный дино и, следовательно, использует их ACM Автоматическое управление сертификатами

Это должно гарантировать, что весь трафик c между клиентами и приложением зашифрован.

Однако мое приложение выполняет запросы к отдельному частному API. Я жду отдельного самозаверяющего сертификата, чтобы иметь возможность подключиться к этому API (так что все это должно быть отдельно от сертификата Heroku). В качестве временного обходного пути .. все подключения к этому API в настоящее время используются с

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

Я читал об опасностях этого и о том, как сделать все узлы незашифрованными. У меня вопрос: остается ли приложение безопасным, когда клиенты подключаются к экземпляру Heroku для других частей приложения, не связанных с вызовами API. Или установка этого env var действительно делает все приложение небезопасным, независимо от сертификата Heroku?

Спасибо!

1 Ответ

1 голос
/ 18 июня 2020

Если я вас правильно понимаю, у вас есть как входящие, так и исходящие подключения, и ваши исходящие подключения к API используют NODE_TLS_REJECT_UNAUTHORIZED.

Clients --in--> Your Application --out--> API

подключение ваших клиентов входящий в ваше приложение будет по-прежнему ЗЕЛЕНЫМ и безопасным, но ваши исходящие подключения к API по-прежнему будут уязвимы. Поэтому, если кто-то атакует ваше исходящее соединение с API, он может получить все данные.

У вас есть два метода решения этой проблемы:

  1. Получить «настоящий» сертификат для API.
  2. «Предварительная авторизация» самозаверяющего сертификата API.

Вы можете загрузить publi c ключ самозаверяющего сертификата и сохранить его в своем NodeJS приложение. Затем в своем запросе просто добавьте:

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

Это решение позволяет указать сертификат CA, который вы ОЖИДАЕТЕ. Убедитесь, что общее имя сертификата совпадает с адресом, который вы вызвали в запросе (как указано в хосте):

var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },

Этот метод НАМНОГО безопаснее, чем просто слепая установка «Принять все неизвестное» люди." Таким образом говорится: «Джон не сертифицирован, но я знаю Джона, и это Джон. Просто примите Джона».

...