通过 AWS ELB 的 MongooseIM SSL 连接
MongooseIM SSL connection via AWS ELB
我在 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 文档没有提供任何解决方案,我也没有看到任何人出现此错误。
任何帮助或线索?
根据您的描述和 MongooseIM 日志片段,我认为客户端从一开始就开始加密连接 - 这就是为什么“已收到 XML”似乎是垃圾。
在 XMPP 中,最初的明文连接使用 STARTTLS 升级为安全连接。这应该适用于具有 TCP 转发且没有 TLS 终止的 ELB,您只需要确保客户端从一开始就没有尝试使用 SSL/TLS,而是使用 STARTTLS。所有流行的 XMPP 库都应该有这个选项,它是核心 XMPP 的一部分。
[...] it is easier to put an ELB TCP to TCP and encrypt by TLS once the connection is open?
完全正确。
I mainly use an ELB to avoid having to handle SSL by myself and if I can not get it, would it be better to directly expose the mongoose server to the Internet?
ELB 不能用于普通 XMPP 的 SSL 终止。可用的选项是:
ELB 转发纯 TCP,使用 MongooseIM 纯 XMPP 侦听器 - 客户端打开 TCP 连接但通过 STARTTLS 升级它,所有 EC2 实例都需要证书配置。
ELB 设置为 HTTPS 终止,MongooseIM 使用 BOSH 侦听器 - BOSH 是基于 HTTP 的 XMPP,因此有一些开销,但是 SSL/TLS 卸载的好处可能是值得的,不EC2 实例上的证书令人头疼。
我在 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 文档没有提供任何解决方案,我也没有看到任何人出现此错误。
任何帮助或线索?
根据您的描述和 MongooseIM 日志片段,我认为客户端从一开始就开始加密连接 - 这就是为什么“已收到 XML”似乎是垃圾。
在 XMPP 中,最初的明文连接使用 STARTTLS 升级为安全连接。这应该适用于具有 TCP 转发且没有 TLS 终止的 ELB,您只需要确保客户端从一开始就没有尝试使用 SSL/TLS,而是使用 STARTTLS。所有流行的 XMPP 库都应该有这个选项,它是核心 XMPP 的一部分。
[...] it is easier to put an ELB TCP to TCP and encrypt by TLS once the connection is open?
完全正确。
I mainly use an ELB to avoid having to handle SSL by myself and if I can not get it, would it be better to directly expose the mongoose server to the Internet?
ELB 不能用于普通 XMPP 的 SSL 终止。可用的选项是:
ELB 转发纯 TCP,使用 MongooseIM 纯 XMPP 侦听器 - 客户端打开 TCP 连接但通过 STARTTLS 升级它,所有 EC2 实例都需要证书配置。
ELB 设置为 HTTPS 终止,MongooseIM 使用 BOSH 侦听器 - BOSH 是基于 HTTP 的 XMPP,因此有一些开销,但是 SSL/TLS 卸载的好处可能是值得的,不EC2 实例上的证书令人头疼。