如何连接 Heroku Redis TLS 节点?

How to Connect Heroku Redis TLS Node?

我似乎无法在 Node 上使用 TLS 连接到 Heroku Redis。

这些文档并没有多大帮助:https://devcenter.heroku.com/articles/securing-heroku-redis

有人有工作示例吗?我应该使用 REDIS_URL 还是 REDIS_TLS_URL?

我正在使用 node_redis v3

不幸的是,我不知道为什么您无法连接到此 Redis 附加组件。

如果您想在另一个附加组件上进行测试,我已经开发了一个 Redis 附加组件,它在 Heroku 上处于“alpha”阶段(免费)。如果您无法连接到它,我可以为您提供一些支持。

如果您有兴趣,请私下给我您的 Heroku 电子邮件,我会向您发送邀请:)

我发现 Heroku 的 Redis 6 附加组件在连接到 REDIS_URL 时生成了一个 Error: self signed certificate in certificate chain 错误,没有任何参数在 Node 上使用 ioredis。您可以通过将 rejectUnauthorized 设置为 false.

的 TLS 选项传递来避免此错误

falserejectUnauthorized 允许使用自签名证书,如果担心 MITM 攻击,这将是一个问题。有关更多背景信息,请参阅 TLS options

这对我有用,最新的 ioredis 包与 rediss:// 和 redis:// URL 的...

  const REDIS_URL = process.env.REDIS_URL;
  const redis_uri = url.parse(REDIS_URL);
  const redisOptions = REDIS_URL.includes("rediss://")
    ? {
        port: Number(redis_uri.port),
        host: redis_uri.hostname,
        password: redis_uri.auth.split(":")[1],
        db: 0,
        tls: {
          rejectUnauthorized: false,
        },
      }
    : REDIS_URL;
  const redis = new Redis(redisOptions);

这是我的方法。分别传递 URL 和 TLS 选项更容易。

const redisUrl = process.env.REDIS_TLS_URL ? process.env.REDIS_TLS_URL : process.env.REDIS_URL;
const redisDefaults = {
  tls: {
  // Heroku uses self-signed certificate, which will cause error in connection, unless check is disabled
  rejectUnauthorized: false,
  },
};
const defaultClient = redis.createClient(redisUrl, redisDefaults);

如果您有测试环境 运行 hobby 版本,TLS 是 URL 在 REDIS_TLS_URL 中设置,而生产通常使用 premium 运行并且环境是 REDIS_URL .因此,为了与两者兼容,我首先寻找 REDIS_TLS_URL,然后寻找 REDIS_URL 以支持测试和生产环境。

对于使用 node-redis 的开发者,您需要在初始化客户端时将 TLS 设置为 true。

redis.createClient({
        url: REDIS_URL,
        socket: {
          tls: true,
          rejectUnauthorized: false,
        },
      }

对于使用 Bull 的人来说,这个实现对我很有效。谢谢@Tom McLellan。

const Queue = require('bull');
const redisUrlParse = require('redis-url-parse');

const REDIS_URL = process.env.REDIS_URL || 'redis://127.0.0.1:6379';
const redisUrlParsed = redisUrlParse(REDIS_URL);
const { host, port, password } = redisUrlParsed;
const bullOptions = REDIS_URL.includes('rediss://')
  ? {
      redis: {
        port: Number(port),
        host,
        password,
        tls: {
          rejectUnauthorized: false,
        },
      },
    }
  : REDIS_URL;

const workQueue = new Queue('work', bullOptions);