如何使用 `redis` 通过 SSL 通过 ssh 隧道连接到 Redis 实例(AWS elasticache)?
How to use `ioredis` to connect to Redis instance (AWS elasticcache) across ssh tunnel with SSL?
这似乎与 ioredis
及其对 TLS 的支持有关。这一切都在 mac、Catalina 等
上
我在 VPC 中有一个 elasticcache Redis 实例 运行。我用 ssh 连接到它,
ssh -L 6379:clustercfg.my-test-redis.amazonaws.com:6379 -N MyEC2
以下不适用于 node 12.9
、ioredis 4.19.4
> const Redis = require("ioredis");
> const redis = new Redis('rediss://127.0.0.1:6379');
[ioredis] Unhandled error event: Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list:
at Object.checkServerIdentity (tls.js:287:12)
<repeated ... many times>
这也不行:
> const Redis = require("ioredis");
> const redis = new Redis('redis://127.0.0.1:6379');
> redis.status
'connect'
> redis.set('fooo','barr').then(console.log).catch(console.error)
Promise { <pending> }
> redis.status
'connect'
有没有办法让我用 ioredis
做这个?这只是为了调试。如果第一种形式是正确的,是否有允许对证书进行“非严格”验证的设置?
这有效(在 mac 上)
% openssl s_client -connect localhost:6379
set "fred" "Mary"
+OK
get "fred"
Mary
这有效(通过 pip3 安装了 redis)
#!/usr/bin/env python3
import redis
r = redis.Redis(host='127.0.0.1', ssl=True, port=6379)
r.set('foo', 'bar')
print(r.get('foo'))
虽然我不建议将其用于生产,但您说这是用于调试。
您需要禁用服务器身份检查。您可以通过使用 noop 覆盖配置中的函数来做到这一点:
const Redis = require("ioredis");
const redis = new Redis('rediss://127.0.0.1:6379', {
tls: {
checkServerIdentity: () => undefined,
}
});
这似乎与 ioredis
及其对 TLS 的支持有关。这一切都在 mac、Catalina 等
我在 VPC 中有一个 elasticcache Redis 实例 运行。我用 ssh 连接到它,
ssh -L 6379:clustercfg.my-test-redis.amazonaws.com:6379 -N MyEC2
以下不适用于 node 12.9
、ioredis 4.19.4
> const Redis = require("ioredis");
> const redis = new Redis('rediss://127.0.0.1:6379');
[ioredis] Unhandled error event: Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list:
at Object.checkServerIdentity (tls.js:287:12)
<repeated ... many times>
这也不行:
> const Redis = require("ioredis");
> const redis = new Redis('redis://127.0.0.1:6379');
> redis.status
'connect'
> redis.set('fooo','barr').then(console.log).catch(console.error)
Promise { <pending> }
> redis.status
'connect'
有没有办法让我用 ioredis
做这个?这只是为了调试。如果第一种形式是正确的,是否有允许对证书进行“非严格”验证的设置?
这有效(在 mac 上)
% openssl s_client -connect localhost:6379
set "fred" "Mary"
+OK
get "fred"
Mary
这有效(通过 pip3 安装了 redis)
#!/usr/bin/env python3
import redis
r = redis.Redis(host='127.0.0.1', ssl=True, port=6379)
r.set('foo', 'bar')
print(r.get('foo'))
虽然我不建议将其用于生产,但您说这是用于调试。
您需要禁用服务器身份检查。您可以通过使用 noop 覆盖配置中的函数来做到这一点:
const Redis = require("ioredis");
const redis = new Redis('rediss://127.0.0.1:6379', {
tls: {
checkServerIdentity: () => undefined,
}
});