【问题标题】:NODE_TLS_REJECT_UNAUTHORIZED Heroku App making whole app insecureNODE_TLS_REJECT_UNAUTHORIZED Heroku App 使整个应用程序不安全
【发布时间】:2020-10-08 15:00:20
【问题描述】:

我在 Heroku 上有一个使用付费测功机的应用,因此使用了他们的 ACM Automated Certificate Management

这应该确保客户端和应用程序之间的所有流量都是加密的。

但是,我的应用调用了一个单独的私有 API。我正在等待一个单独的自签名证书,以便能够连接到这个 API(所以这应该与 Heroku 证书分开)。作为临时解决方法..与此 API 的所有连接当前都与

一起使用

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

我已经了解了这样做的危险以及如何使所有节点不加密。我的问题是,当客户端连接到 Heroku 实例以获取应用程序的其他不涉及 API 标注的部分时,该应用程序是否仍然安全。或者无论 Heroku 证书如何,设置该 env var 是否真的会使整个应用程序不安全?

谢谢!

【问题讨论】:

  • 嗯。与所有事物的安全性一样,它不是一个是/否,而是一个梯度。拥有NODE_TLS_REJECT_UNAUTHORIZED=0 不会立即使您的烤面包机爆炸或您的应用程序“不安全”。它只是让它容易受到中间人攻击。你有所谓的“群体免疫”;在数百万个应用程序中,您的应用程序不太可能成为黑客攻击的目标。我们在安全社区中喜欢您想要正确地做这件事,但要明白,在您获得有效证书的情况下让该设置保持几天不会像我们所知的那样使社会崩溃。

标签: javascript node.js security ssl heroku


【解决方案1】:

如果我的理解正确,您有传入和传出连接,并且您与 API 的出站连接使用的是NODE_TLS_REJECT_UNAUTHORIZED

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

您的客户端与您的应用程序的入站连接仍将是绿色且安全的,但您与 API 的出站连接仍将易受攻击。

就像一条链条,它的强度取决于它最薄弱的一环。因此,如果有人要攻击您与 API 的出站连接,他们可能会收到所有数据。

你有两种方法解决这个问题:

  1. 获取 API 的“真实”证书。
  2. “预授权”自签名 API 证书。

您可以下载自签名证书的公钥并将其存储在您的 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
    },

这种方法比盲目地设置“接受所有不认识的人”要安全得多。这种方式是说“约翰没有认证,但我认识约翰,那就是约翰。接受约翰。”

【讨论】:

  • 自签名证书本身并不坏或坏,它们只是被误解和误用。 “自签名”部分只是意味着它不是来自已知验证的第三方。但是如果这个连接只有两方(你的应用程序,你的 API),你不需要第三方来验证你。事实上,这可以说更安全,因为您告诉您的应用程序只验证一个特定的证书,而不接受来自第三方的所有“有效”证书。您现在不是说“我会接受任何经过验证的人”,而是说“我只会接受约翰。”
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 2014-09-11
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多