ejabberd - 使用 OMEMO 加密向 XMPP MultiUserChat 中的未知用户发送消息

标签 ejabberd smack multiuserchat omemo

我正在尝试构建一个带有 OMEMO 加密的 MUC 平台,以便在 Android 应用程序上使用。我正在使用 Ejabberd (v17.11) 和 Smack 库 (v4.2.1)。

MUC 房间是持久的,它们allow_subscription 用于 Muc/Sub 支持,用于离线消息。

当客户以“所有者”身份开始新房间并从他的名册中添加“成员”时;所有的客户都加入了房间,一切似乎都很好。 所有者可以向群组发送消息,并将消息传递给每个成员。

但是,当一个群组成员试图发送消息时,如果他不“知道”该群组的所有成员(如果他们不在他的花名册中),他就无法发送消息!

我发现,在向群组发送OMEMO消息时,需要为每个成员单独加密消息,这需要获取每个成员的devicelist!

关于这一步:

mOmemoManager.encrypt(muc, msgBody);

它尝试为所有收件人加密,但获取未知用户的设备列表会导致崩溃。

已发送:

<iq to='unknownuser@server.com' id='141' type='get'><query xmlns='http://jabber.org/protocol/disco#info' node='eu.siacs.conversations.axolotl.devicelist'></query></iq>

回复:

<iq xml:lang='en' to='myuser@server.com/mobile' from='unknownuser@server.com' type='error' id='141'><query node='eu.siacs.conversations.axolotl.devicelist' xmlns='http://jabber.org/protocol/disco#info'/><error code='407' type='auth'><subscription-required xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Not subscribed</text></error></iq>

Smack 的错误:

Could not fetch device list of unknownuser@server.com: .....
XMPPError: subscription-required - auth

那么,我该如何解决呢? 在聊天组中,每个用户不必见面。当他们聚在一起时,我是否应该将每个人都添加到每个人的花名册中?

或者这是关于房间从属关系或角色的问题吗?

或者关于 Ejabberd 配置的一些东西?

[{title,<<"groupName">>},  
{allow_query_users,true},  
{allow_private_messages,true},
{allow_private_messages_from_visitors,anyone},
{allow_visitor_status,true},  
{allow_visitor_nickchange,true},  
{public,false},  
{public_list,false},  
{persistent,true},  
{moderated,true},  
{members_by_default,true},  
{members_only,true},  
{allow_user_invites,true},
{anonymous,false},
{logging,false},
{allow_voice_requests,true},
{allow_subscription,true},
{mam,true},
{presence_broadcast,[moderator,participant,visitor]},
{voice_request_min_interval,1800},
{vcard,<<>>},
{captcha_whitelist,[]},
{affiliations,[{{<<"user1">>,<<"server.com">>,<<>>},{member,<<>>}},                 {{<<"user2">>,<<"server.com">>,<<>>},{owner,<<>>}},                 {{<<"user3">>,<<"server.com">>,<<>>},{member,<<>>}}]},
{subject,[]},
{subject_author,<<>>}]

最佳答案

OMEMO 要求发送者能够读取接收者的 OMEMO pubsub 节点。这是获取接收者预 key 包以构建 session 所必需的。

现代实现将 OMEMO pubsub 节点配置为公开 - 还有一个 ejabberd config为遗留客户强制执行此操作。

因此,OMEMO 的大多数客户端实现将加密功能限制为仅在私有(private)群聊中可用。在这种情况下,所有联系人都在彼此的名册中,并且可以访问彼此的 OMEMO 节点。加密公开可用的群聊无论如何都没有意义,因为攻击者可以简单地加入聊天以阅读消息。

如果您想将您的 OMEMO pubsub 节点配置为在您的客户端中公开,请查看如何 smack-openpgp does change to access model .

关于ejabberd - 使用 OMEMO 加密向 XMPP MultiUserChat 中的未知用户发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004845/

相关文章:

api - 使用 ejabberd API 按用户获取订阅组列表

android - 如何在 xmpp android 中的多用户聊天/群聊和一对一聊天中发送撰写/正在输入(聊天状态)事件?

android - 使用 ejabberd 将参与者添加到聊天室

iOS 使用 XMPP 连接到 ejabberd 失败

connection - eJabberD TLS 驱动程序错误

android - 如何从 Smack 4.1 创建帐户

java - 无法在 JAVA 中使用 SMACK api 显示收到的消息

Android 和 XMPP : Currently available solutions

c# - XMPP C# 交互

javascript - 在 XMPP pubsub 中,订阅者是否可以检索订阅列表或将其与 MUC 结合?