使用传输中加密连接到 AWS ElastiCache + 来自 redis-cli+stunnel 以外的客户端的身份验证

Connect to AWS ElastiCache with In-Transit Encryption + Auth from client other than redis-cli+stunnel

我正在尝试使用 Ruby redis client and either one of two NodeJS clients (node_redis or ioredis) 连接到启用了传输中加密和身份验证的 Amazon ElastiCache 集群,但遇到了问题。对于所有三个客户端,我一连接就立即收到 ECONNRESET 错误,并且在连接重试发生时一遍又一遍地抛出。

我已经按照 AWS docs 进行操作,并且能够使用 stunnel 通过 redis-cli 成功连接,但到目前为止还无法与任何其他客户端连接。

从这个 来看,似乎不需要证书,我们只需要将空选项传递给 TLS 配置(如果适用),但无论我输入什么,我都不成功。为了以防万一,我还尝试将默认的 stunnel stunnel.pem 私钥作为证书传递给所有客户端,但它显然也不起作用。来自其他使用过 ElastiCache 的人的任何帮助或专业知识都会有所帮助!

对于两个客户端,默认的 TLS 行为是验证服务器证书,我们需要将其禁用。两个客户端的解决方案如下:

NodeJS 客户端:

const redis = require('redis')
const client = redis.createClient({host: hostOrIp, port: 6379, auth_pass: 'thePassword', tls: { checkServerIdentity: () => undefined }})

Ruby 客户:

require "redis"
redis = Redis.new(url: connectionString, ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE })

我 运行 遇到了类似的问题,但我遇到的不是 ECONNRESET,而是超时。对我来说,有几个问题需要解决

  • lambda 需要 VPC permissions
  • ElastiCache 安全组需要来自 Lambda 安全组的入站规则,以允许在 Redis 端口上进行通信。我以为他们可以在同一个安全组中。
  • 因为开启了加密in-transit,所以我需要通过redis.RedisClient(... ssl=True)redis-py 页面提到 ssl_cert_reqs 需要设置为 None 才能与 ElastiCache 一起使用,类似于所回答的内容,但在我的情况下似乎并非如此。我认为 AWS 已更新 ElastiCache 证书以具有正确的主机名。但是我确实需要通过 ssl=True.

需要设置 ssl=True 是有道理的,但连接只是超时,所以我四处寻找,试图找出 permissions/VPC/SG 设置的问题所在。