【问题标题】:MongooseIM SSL connection via AWS ELB通过 AWS ELB 的 MongooseIM SSL 连接
【发布时间】:2019-06-10 06:42:13
【问题描述】:

我在 AWS 的 EC2 实例中使用 docker-compose 配置了 MongooseIM 服务器。

我打算通过以下方式通过端口 5222(mongooseim 的模块 ejabberd_c2s)上的 ELB (AWS) 使用 SSL 访问一些移动客户端:

     SSL (Secure TCP) -> 5222 -> TCP -> 5222  (EC2 Instance Port)

在 ejabberd_c2s 模块配置中,我有以下内容:

    { 5222, ejabberd_c2s, [

                %%
                %% If TLS is compiled in and you installed a SSL
                %% certificate, specify the full path to the
                %% file and uncomment this line:
                %%
                {certfile, "priv/ssl/fake_server.pem"}, starttls,

                %%{zlib, 10000},
                %% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS
                %% {ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"},
                {access, c2s},
                {shaper, c2s_shaper},
                {max_stanza_size, 65536},
                {protocol_options, ["no_sslv3"]}

               ]},

但是客户无法连接,我在服务器上得到的唯一消息是:

    mongooseim_server_dev | 10:58:25.885 [info] (#Port<0.27608>) Accepted connection {{10,0,17,246},42571} -> {{172,18,0,2},5222}
    mongooseim_server_dev | 10:58:25.885 [debug] Received XML on stream = "���yw�\��.ndEt�;�����fn�A>� n:�=5��</A
     "ngooseim_server_dev | ��kj98����g@32ED�(#
    mongooseim_server_dev | 10:58:25.885 [debug] Send XML on stream = <<"<?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='2B421BCD2D077161' from='localhost' version='1.0'>">>
    mongooseim_server_dev | 10:58:25.886 [debug] Send XML on stream = <<"<stream:error><xml-not-well-formed xmlns='urn:ietf:params:xml:ns:xmpp-streams'/></stream:error>">>
    mongooseim_server_dev | 10:58:25.886 [debug] Send XML on stream = <<"</stream:stream>">>

Mongoose 文档没有为我提供任何解决方案,而且我没有看到任何人出现此错误。

任何帮助或线索?

【问题讨论】:

    标签: amazon-web-services ssl erlang mongoose-im aws-elb


    【解决方案1】:

    根据您的描述和 MongooseIM 日志 sn-p,我认为客户端从一开始就开始了加密连接 - 这就是为什么“收到的 XML”似乎是垃圾。

    在 XMPP 中,最初的明文连接使用STARTTLS 升级为安全连接。这应该适用于带有 TCP 转发且没有 TLS 终止的 ELB,您只需确保客户端从一开始就没有尝试使用 SSL/TLS,而是使用 STARTTLS。所有流行的 XMPP 库都应该有这个选项,它是核心 XMPP 的一部分。


    [...] 连接打开后,是否更容易将 ELB TCP 转入 TCP 并通过 TLS 加密?

    没错。

    我主要使用ELB来避免自己处理SSL,如果我不能得到它,直接将猫鼬服务器暴露在互联网上会更好吗?

    ELB 不能用于普通 XMPP 的 SSL 终止。可用的选项有:

    1. ELB 转发纯 TCP,使用 MongooseIM 纯 XMPP 侦听器 - 客户端打开 TCP 连接但通过 STARTTLS 升级它,所有 EC2 实例都需要证书配置。

    2. ELB 设置为 HTTPS 终止,MongooseIM 使用 BOSH 侦听器 - BOSH 是基于 HTTP 的 XMPP,因此有一些开销,但 SSL/TLS 卸载的好处可能是值得的,不用担心 EC2 实例上的证书。

    【讨论】:

    • 首先感谢您的回答!所以我知道一旦连接打开,将 ELB TCP 放到 TCP 并通过 TLS 加密会更容易吗?因为我主要使用ELB来避免必须自己处理SSL,如果我不能得到它,直接将猫鼬服务器暴露在互联网上会更好吗?有关如何在 AWS 中公开 MongooseIM 服务器的任何建议?非常感谢您的关注。
    • 啊,我的错!我没有正确阅读“SSL (Secure TCP) -> 5222 -> TCP -> 5222 (EC2 Instance Port)”。我已经相应地更新了答案。
    • "直接把猫鼬服务器暴露在互联网上会不会更好?"如果您不希望 ELB 进行负载平衡并认为 DNS 负载平衡已足够,您可能会这样做 - 您必须进行设置。当 MongooseIM EC2 实例启动/关闭时,DNS 记录可能需要一段时间才能更新,但在您的情况下,这可能是问题,也可能不是问题。
    • 感谢您的回答! “ELB 不能用于普通 XMPP 的 SSL 终止。”好的,然后我在 ELB 中使用纯 TCP 和自签名证书(在移动客户端中升级与 STARTTLS 的连接)我们不能将 SSL 与 BOSH 一起使用,因为 XMPPFramework 不支持它。 stackoverflow.com/questions/26689261/… 再次感谢您的时间和知识,真的很有用。问候!
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多