通过AWS ELB连接MongooseIM SSL

3

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

我打算通过ELB(AWS)在5222端口(mongooseim的ejabberd_c2s模块)上为一些移动客户端提供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文档中没有为我提供任何解决方案,我也没有看到其他人遇到过这个错误。

有任何帮助或提示吗?

1个回答

5
根据您的描述和MongooseIM日志片段,我推测客户端从一开始就启动了加密连接,这就是为什么“Received XML”似乎是垃圾的原因。
在XMPP中,最初的明文连接通过STARTTLS升级为安全连接。这应该可以与ELB和TCP转发一起正常工作,而无需TLS终止,只需确保客户端不尝试从一开始就使用SSL / TLS,而是使用STARTTLS。所有流行的XMPP库都应该有此选项,它是XMPP核心的一部分。
「...在连接建立后,使用ELB TCP到TCP并通过TLS加密会更容易吗?」
「没错。」
「我主要使用ELB来避免自己处理SSL,如果我不能做到这一点,直接将mongoose服务器暴露在互联网上会更好吗?」
「ELB无法用于纯XMPP的SSL终止。可用选项有:1. ELB转发纯TCP,MongooseIM使用纯XMPP侦听器 - 客户端打开TCP连接,但通过STARTTLS升级它,所有EC2实例都需要证书配备。2. ELB设置HTTPS终止,MongooseIM使用BOSH侦听器 - BOSH是XMPP over HTTP,因此具有一些开销,但SSL / TLS卸载的好处可能值得,不需要在EC2实例上处理证书问题。」

首先,感谢您的回答!所以我明白了,打开连接后,将ELB TCP放到TCP上并通过TLS加密会更容易?因为我主要使用ELB来避免自己处理SSL,如果我无法做到这一点,直接将Mongoose服务器暴露在互联网上是否更好?有关如何在AWS中公开MongooseIM服务器的任何建议吗?非常感谢您的关注。 - AndoniRodriguez
啊,我的错!我没有仔细阅读"SSL(安全TCP)-〉5222-〉TCP -〉5222(EC2实例端口)"。 我已经相应地更新了答案。 - erszcz
“直接将Mongoose服务器暴露在互联网上会更好吗?” 如果您不想使用ELB进行负载均衡,并认为DNS负载均衡足够,那么您可以这样做-但您必须设置。当MongooseIM EC2实例启动/关闭时,DNS记录可能需要一段时间才能更新,但这可能或可能不是您的问题。 - erszcz
谢谢回答!ELB不能用于纯XMPP的SSL终止。那么我在ELB中使用普通TCP和自签名证书(在移动客户端上使用STARTTLS升级连接)。我们无法在BOSH中使用SSL,因为XMPPFramework不支持它。https://dev59.com/xV8d5IYBdhLWcg3wkSwV再次感谢您的时间和知识,非常有用。问候! - AndoniRodriguez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接