如何连接Heroku Redis TLS节点?

z6psavjg  于 2022-11-24  发布在  Redis
关注(0)|答案(6)|浏览(173)

我似乎无法在节点上使用TLS连接到Heroku Redis。
这些文档实际上没有多大帮助:https://devcenter.heroku.com/articles/securing-heroku-redis
有没有人有一个工作的例子?我应该使用REDIS_URL还是REDIS_TLS_URL?
使用node_redis v3的IM

jrcvhitl

jrcvhitl1#

我发现Heroku的Redis 6插件在没有任何ioredis参数的情况下连接到REDIS_URL时会产生Error: self signed certificate in certificate chain错误。您可以通过将rejectUnauthorized设置为false来传递TLS选项来避免此错误。
falserejectUnauthorized允许自签名证书,如果担心MITM攻击,这将是一个问题。有关更多背景信息,请参阅TLS选项。
这是为我工作与redis://和redis://的URL的最新ioredis包...

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);
20jt8wwn

20jt8wwn2#

下面是我的方法:分别传递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是在REDIS_TLS_URL中设置的URL,而生产环境通常运行在premium版本,环境是REDIS_URL。所以,为了与两者兼容,我首先寻找REDIS_TLS_URL,然后寻找REDIS_URL来支持测试和生产环境。

5vf7fwbs

5vf7fwbs3#

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

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

zfycwa2u4#

我不知道为什么你不能连接到这个Redis加载项不幸。
如果你想在其他的附加组件上测试,我已经开发了一个Redis附加组件,在Heroku上处于“alpha”阶段(免费)。如果你不能连接到它,我可以为你提供一些支持。
如果你有兴趣,给予我你的Heroku电子邮件在私人,我会给你一个邀请:)

2eafrhcq

2eafrhcq5#

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

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);
dl5txlt9

dl5txlt96#

这对我使用node-redis v3.0.0很有效

const opts = config.REDIS_URL.includes('rediss://') ? {
  url: config.REDIS_URL,
  tls: {
    rejectUnauthorized: false
  }
} : config.REDIS_URL;

const client = redis.createClient(opts);

使用tls而不是socket。多亏了这个。

相关问题