Elixir: пакет Redix не работает с SSL на CentOS 7 - PullRequest
0 голосов
/ 29 апреля 2020

Я настроил Redis 5.x с помощью stunnel для приема SSL-соединений от клиента. Настройка довольно проста, и я просто следую инструкциям с сайта Redis.

Это что-то вроде: stunnel принимает запросы клиентов через соединение SSL и перенаправляет на redis через соединение не-SSL.

На 2 моих компьютерах разработки, на которых установлена ​​Ma c OS X, установка прекрасно работает с Ruby gem redis и библиотекой Elixir Redix.

Команды следующие:

Ruby:

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 хорошо работает на 2 разных машинах Ma c.

Когда я разверните ту же настройку на Linux машине, на которой работает CentOS 7, клиент Ruby по-прежнему работает нормально.

Однако в CentOS 7 Redix Elixir перестает работать, и я получаю сообщение об ошибке:

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

Для меня это не имеет никакого смысла, потому что Cent OS имеет stunnel + настройка redis точно такая же, как и у моих машин 2 dev Ma c. И клиент Ruby хорошо работает на всех 3 машинах: 2 Ma c и 1 CentOS.

Однако Elixir Redix работает только на машинах 2 Ma c, но не на Цент ОС . Та же настройка, тот же код.

Вопрос: Почему код Elixir Redix SSL не работает на CentOS, а работает на Ma c?

(Та же настройка, тот же код)

Дополнительная информация: На компьютерах Ma c и 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

Может быть, в этом проблема. Но я не вижу этого на машинах Ma c.

1 Ответ

1 голос
/ 30 апреля 2020

Учитывая номер строки в сообщении об ошибке, мы можем видеть, что ошибка происходит от здесь . Таким образом, это ошибка, которую мы получаем, если tls_record:is_acceptable_version возвращает false, что означает, что stunnel предлагает версию TLS, которую клиент Elixir не хочет использовать.

Вы можете проверить, какие версии TLS клиент Elixir готов к использованию, добавив эту строку непосредственно перед вызовом Redix.start_link:

IO.inspect(:ssl.versions())

И вы можете использовать Wireshark и перехватить трафик c, идущий к порту 6380 на интерфейсе обратной связи, чтобы увидеть, какая версия TLS Stunnel хочет использовать - это одно из полей в сообщении «Server Hello».

...