首页 > 解决方案 > Elixir:Redix 软件包不适用于 CentOS 7 上的 SSL

问题描述

我使用 stunnel 设置 Redis 5.x 以接受来自客户端的 SSL 连接。设置非常简单,我只是按照 Redis 站点的说明进行操作。

它类似于:stunnel 通过 SSL 连接接受客户端请求并通过非 SSL 连接转发到 redis。

在我的两台运行 Mac OS X 的开发计算机上,该设置与 Ruby gem redis 和 Elixir Redix 库一起工作得很好。

命令如下:

红宝石:

redis = Redis.new(host: "127.0.0.1", port: 6380, db: 3, ssl: true, password: 'SomeSecret :)')

redis.ping

灵药:

{:ok, conn} = Redix.start_link( host: "127.0.0.1", port: 6380, ssl: true, password: "SomeSecret :)", socket_opts: [verify: :verify_none])

Redix.command(conn, ["PING"])

所以我知道 redis + stunnel 设置在 2 台不同的 Mac 机器上运行良好。

当我将相同的设置部署到运行 CentOS 7 的 Linux 机器上时,Ruby 客户端仍然可以正常工作。

但是,在 CentOS 7 上,Elixir Redix 停止工作,我收到错误消息:

{:error, %Redix.ConnectionError{reason: :closed}}

对我来说,这没有任何意义,因为 Cent OS 的 stunnel + redis 设置与我的 2 dev Mac 机器完全相同。Ruby 客户端在所有 3 台机器上运行良好:2 台 Mac 和 1 台 CentOS。

但是,Elixir Redix 只能在 2 台 Mac 机器上运行,而不能在 Cent OS 上运行。相同的设置,相同的代码。

问:为什么 Elixir Redix SSL 代码不能在 CentOS 上运行,而在 Mac 上运行?

(相同的设置,相同的代码)

更多信息:在 Mac 机器和 CentOS 机器上,我有:

Erlang/OTP 22 [erts-10.4.3] [source] [64-bit]
Elixir 1.9.0 (compiled with Erlang/OTP 20)

我只是发现在 CentOS 上,在日志中,有一个错误:

TLS client: In state hello at tls_handshake.erl:182 generated CLIENT ALERT: Fatal - Protocol Version

也许这就是问题所在。但我在 Mac 机器上看不到它。

标签: sslrediselixirstunnel

解决方案


给定错误消息中的行号,我们可以看到错误来自这里。因此,如果返回 false,我们会得到这个错误tls_record:is_acceptable_version,这意味着 stunnel 建议使用 Elixir 客户端不想使用的 TLS 版本。

Redix.start_link您可以通过在调用之前添加以下行来检查 Elixir 客户端准备使用哪些 TLS 版本:

IO.inspect(:ssl.versions())

您可以使用 Wireshark 并捕获流向环回接口上端口 6380 的流量,以查看 stunnel 想要使用哪个 TLS 版本 - 这是“Server Hello”消息中的字段之一。


推荐阅读