【问题标题】:How can I get TLS working with Erlang 21?如何让 TLS 与 Erlang 21 一起使用?
【发布时间】:2019-05-26 12:37:14
【问题描述】:

我有以下问题:

灵药

[centos@ip-172-172-3-49 helix]$ env MIX_ENV=prod mix release
Could not find Hex, which is needed to build dependency :plug_cowboy
Shall I install Hex? (if running non-interactively, use "mix local.hex --force") [Yn] Y

18:12:32.462 [info]  ['TLS', 32, 'client', 58, 32, 73, 110, 32, 115, 116, 97, 116, 101, 32, 'hello', 32, 'received SERVER ALERT: Fatal - Handshake Failure', 10]
** (Mix) httpc request failed with: {:failed_connect, [{:to_address, {'repo.hex.pm', 443}}, {:inet6, [:inet6], :enetunreach}, {:inet, [:inet], {:tls_alert, 'handshake failure'}}]}

Could not install Hex because Mix could not download metadata at https://repo.hex.pm/installs/hex-1.x.csv.

我猜根本原因是 Erlang 的原因

Erlang/OTP 21 [erts-10.2.1] [source] [64-bit] [smp:36:36] [ds:36:36:10] [async-threads:1] [hipe]
1> ssl:start().
ok
2> Sock = fun() -> {ok, S} = gen_tcp:connect("google.com", 443, []), S end.
#Fun<erl_eval.20.128620087>
3>  ssl:connect(Sock(), []).
=INFO REPORT==== 28-Dec-2018::18:10:30.019612 ===
TLS client: In state hello received SERVER ALERT: Fatal - Handshake Failure
{error,{tls_alert,"handshake failure"}}

目前有解决方法吗?操作系统是 Centos 7。

更新1

在 MacOS 上有效:

Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:6:6] [ds:6:6:10] [async-threads:1] [hipe] [dtrace]

Eshell V10.2  (abort with ^G)
1> ssl:start().
ok
2>  Sock = fun() -> {ok, S} = gen_tcp:connect("google.com", 443, []), S end.
#Fun<erl_eval.20.128620087>
3>  ssl:connect(Sock(), []).
{ok,{sslsocket,{gen_tcp,#Port<0.6>,tls_connection,undefined},
               [<0.100.0>,<0.99.0>]}}
4>

【问题讨论】:

  • 您的服务器是否可能没有适当的 CA 证书?常规 curl 命令是否有效? curl https://google.com?
  • 我将范围缩小到我正在使用的 Erlang RPM。另一个 Erlang 安装工作得很好。

标签: ssl erlang elixir


【解决方案1】:

事实证明,我使用的 Erlang RPM 不能正确支持 Erlang 中的新 SSL。

https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.1/erlang-21.2.1-1.el7.centos.x86_64.rpm

使用 Erlang Solutions 的不同版本可以正常工作:

https://packages.erlang-solutions.com/erlang/esl-erlang/FLAVOUR_1_general/esl-erlang_21.2-1~centos~7_amd64.rpm

【讨论】:

    【解决方案2】:

    此处描述了 ssl:connect/2:http://erlang.org/doc/man/ssl.html#connect-2

    连接很简单:

    ssl:start().
    ssl:connect("www.google.com", 443, []).
    

    【讨论】:

    • 我认为问题更多是关于我们如何进行系统范围的修复(如果可能的话)。我将检查实现此功能的 Mix 的 Elixir 代码。
    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2010-09-29
    • 2015-12-16
    • 2011-03-25
    • 2018-07-10
    • 2015-12-10
    • 2017-03-25
    • 1970-01-01
    相关资源
    最近更新 更多