如何使用 `redis` 通过 SSL 跨 ssh 隧道连接到 Redis 实例(AWS elasticache)?

Posted

技术标签:

【中文标题】如何使用 `redis` 通过 SSL 跨 ssh 隧道连接到 Redis 实例(AWS elasticache)?【英文标题】:How to use `ioredis` to connect to Redis instance (AWS elasticcache) across ssh tunnel with SSL? 【发布时间】:2021-04-03 01:32:03 【问题描述】:

这似乎与ioredis 及其对 TLS 的支持有关。这一切都在 mac、Catalina 等设备上。

我在 VPC 内运行了一个 elasticcache Redis 实例。我用 ssh 隧道到它,

ssh -L 6379:clustercfg.my-test-redis.amazonaws.com:6379 -N MyEC2

以下内容不适用于node 12.9ioredis 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"
$4
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'))

【问题讨论】:

我认为答案可能是process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';,但我仍然很好奇 ioredis 中是否有特定的配置设置而不是全局执行此设置。 (确实有效。) 【参考方案1】:

虽然我不建议将其用于生产,但您说这是用于调试。

您需要禁用服务器身份检查。您可以通过使用 noop 覆盖配置中的函数来做到这一点:

const Redis = require("ioredis");
const redis = new Redis('rediss://127.0.0.1:6379', 
  tls: 
    checkServerIdentity: () => undefined,
  
);

【讨论】:

以上是关于如何使用 `redis` 通过 SSL 跨 ssh 隧道连接到 Redis 实例(AWS elasticache)?的主要内容,如果未能解决你的问题,请参考以下文章

在 Internet Explorer 上使用 Windows 身份验证通过 SSL 进行跨域 ajax 调用失败

FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

经过身份验证的服务不支持跨域 javascript 回调。通过 SSL 代理对 WCF 服务的 AJAX 查询

如何使用ssl设置Docker redis容器

如何从本地使用 SSL 加密连接到 AWS RDS?