我用stunnel设置redis5.x来接受来自客户端的ssl连接。设置非常简单,我只是按照redis站点的说明进行。
它类似于:stunnel通过ssl连接接受客户端请求,并通过非ssl连接转发到redis。
在我的两台都运行macosx的dev计算机上,使用ruby-gem-redis和elixir-redix库可以很好地进行安装。
命令如下:
Ruby:
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设置在两台不同的mac机器上运行得很好。
当我将相同的设置部署到运行centos 7的linux机器上时,ruby客户机仍然可以正常工作。
然而,在centos 7上,elixir redix停止工作,我得到一个错误:
{:error, %Redix.ConnectionError{reason: :closed}}
对我来说,这没有任何意义,因为cent操作系统的stunnel+redis设置与我的2台dev mac机器完全相同。ruby客户端在所有3台机器上都运行良好:2台mac和1台centos。
不过,elixir redix只能在2台mac电脑上运行,而不能在cent操作系统上运行。相同的设置,相同的代码。
问:为什么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电脑上看不到。
1条答案
按热度按时间s1ag04yj1#
给定错误消息中的行号,我们可以看到错误来自这里。因此,如果
tls_record:is_acceptable_version
返回false,这意味着stunnel建议使用elixir客户端不想使用的tls版本。您可以通过在
Redix.start_link
电话:您可以使用wireshark并捕获到loopback接口上的6380端口的流量,以查看stunnel想要使用哪个tls版本—这是“server hello”消息中的一个字段。