我在AWS的EC2实例中配置了MongooseIM服务器,并使用docker compose。
我打算通过5222端口上的ELB(AWS)(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文档没有为我提供任何解决方案,我也没有看到任何人出现这个错误。
有什么帮助或线索吗?
根据您的描述和MongooseIM日志片段,我认为客户端从一开始就开始了加密连接——这就是为什么;接收的XML";似乎是垃圾。
在XMPP中,最初的明文连接使用STARTTLS升级为安全连接。这应该可以与具有TCP转发和无TLS终止的ELB一起工作,您只需要确保客户端从一开始就没有尝试使用SSL/TLS,而是使用STARTTLS。所有流行的XMPP库都应该有这个选项,它是核心XMPP的一部分。
[…]一旦连接打开,将ELB TCP放入TCP并通过TLS加密会更容易吗?
没错。
我主要使用ELB来避免必须自己处理SSL,如果我无法获得它,直接将猫鼬服务器暴露在互联网上会更好吗?
ELB不能用于普通XMPP的SSL终止。可用选项包括:
-
ELB转发纯TCP,使用MongooseIM纯XMPP侦听器-客户端打开TCP连接,但通过STARTTLS升级,所有EC2实例都需要证书设置。
-
ELB是为HTTPS终止而设置的,MongooseIM使用BOSH侦听器-BOSH是HTTP上的XMPP,因此有一些开销,但SSL/TLS卸载的好处可能是值得的,EC2实例上的证书不会让人头疼。