如何连接 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 选项传递来避免此错误
false
的 rejectUnauthorized
允许使用自签名证书,如果担心 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);
我似乎无法在 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
.
false
的 rejectUnauthorized
允许使用自签名证书,如果担心 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);