Elixir: пакет Redix не работает с SSL в CentOS 7

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

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

На двух моих компьютерах для разработчиков, работающих под управлением 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 хорошо работает на двух разных машинах Mac.

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

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

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

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

Однако Elixir Redix работает только на двух компьютерах Mac, но не на ОС Cent. Та же установка, тот же код.

Вопрос: Почему SSL-код Elixir Redix не работает на 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.


person Châu Hồng Lĩnh    schedule 29.04.2020    source источник
comment
«Я не вижу этого на компьютерах Mac» — у компьютеров Mac никогда не было надежной актуальной поддержки современного TLS, поэтому я не удивлен. Вряд ли это ОС, готовая к разработке в целом.   -  person Aleksei Matiushkin    schedule 30.04.2020


Ответы (1)


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

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

IO.inspect(:ssl.versions())

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

person legoscia    schedule 30.04.2020
comment
Спасибо. Точно в точку. Я только что обнаружил это сегодня утром и собираюсь опубликовать ответ для себя :) - person Châu Hồng Lĩnh; 30.04.2020