我正在尝试使用OMEMO加密构建一个MUC平台,以便在Android应用上使用。我正在使用Ejabberd(v.17.11)和Smack库(v4.2.1)。
MUC房间是persistent
,他们allow_subscription
用于Muc / Sub支持,用于离线消息。
当客户以“所有者”的身份开始新房间并从他的名单中添加“成员”时;所有的客户都加入了房间,一切都很好。所有者可以向该组发送消息,并将其发送给每个成员。
但是当一个小组成员试图发送消息时,如果他不“知道”该小组的所有成员(如果他们不在他的名单中),他就不能发送消息!
我发现,当向组发送OMEMO消息时,有必要为每个成员单独加密消息,这需要获得每个成员的devicelist
!
在这一步:
mOmemoManager.encrypt(muc, msgBody);
它尝试为所有收件人加密,但是获取未知用户的设备列表会导致崩溃。
发送方:
<iq to='[email protected]' id='141' type='get'><query xmlns='http://jabber.org/protocol/disco#info' node='eu.siacs.conversations.axolotl.devicelist'></query></iq>
RECV:
<iq xml:lang='en' to='[email protected]/mobile' from='[email protected]' 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的错误:
无法获取[email protected]的设备列表:..... 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节点的收件人。这是获取收件人preKey包以构建会话所必需的。
现代实现将OMEMO pubsub节点配置为公共 - 还有一个ejabberd config来强制它用于旧版客户端。
因此,OMEMO的大多数客户端实现都将加密功能限制为仅在私人组聊天中可用。在这种情况下,所有联系人都在彼此的名单中,并且可以访问彼此的OMEMO节点。加密公开的群组聊天无论如何都没有意义,因为攻击者可以简单地加入聊天以便阅读消息。
如果要将OMEMO pubsub节点配置为在客户端内公开,请查看smack-openpgp does change to access model的方式。