我设置了Redis 5.x和stunnel来接受来自客户端的SSL连接。设置非常简单,我只是按照Redis网站上的说明进行设置。
它是这样的:stunnel通过SSL连接接受客户端请求,并通过非SSL连接转发到Redis。
在我的两台运行Mac OS X的开发电脑上,使用Ruby gem redis和Elixir Redix库,这个设置工作正常。
命令如下。
Ruby: Elixir:
redis = Redis.new(host: "127.0.0.1", port: 6380, db: 3, ssl: true, password: 'SomeSecret :)')
redis.ping
Elixir:
{: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}}
对我来说,这没有任何意义 因为CentOS的stunnel+redis设置 和我的两台Mac开发机完全一样。而且Ruby客户端在3台机器上都能正常工作:2台Mac和1台CentOS。
但是。Elixir Redix只在2台Mac机上工作,但在Cent OS上却不能工作。. 同样的设置,同样的代码。
(相同的设置,相同的代码)
更多信息。在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机上没有看到。
根据错误信息中的行号,我们可以看出错误来自于 此处. 因此,这个错误是我们得到的,如果 tls_record:is_acceptable_version
返回 false,这意味着 stunnel 建议使用 Elixir 客户端不想使用的 TLS 版本。
你可以通过在 Redix.start_link
调用。
IO.inspect(:ssl.versions())
你可以用Wireshark 捕捉到环回接口6380端口的流量 看看stunnel想使用哪个TLS版本