Omemo消息投递失败:InvalidKeyException异常排查求助
异常原因分析
- Bundle格式损坏:你提供的Bundle XML存在明显语法错误(如开头标签
<items](http://jabber.org/protocol/pubsub"><items)格式混乱,包含多余字符和错误引号),导致解析出的Signed PreKey、签名或身份公钥数据不正确,触发签名验证失败。 - PreKeyBundle构造参数不匹配:构造
PreKeyBundle时,传入的signedPreKey、signedPreKeySignature、identityKey三者不匹配——签名必须是由对应身份私钥对Signed PreKey的序列化数据生成的,若任意一项对应错误,验证都会失败。 - 数据传输/编码异常:Bundle的Base64编码内容在传输或存储时被截断、篡改,解码后的数据与原始Bundle数据不一致,导致签名验证无法通过。
解决方法
- 修复Bundle XML格式:修正XML的语法错误,将开头错误标签替换为合法的
<items node="eu.siacs.conversations.axolotl.bundles:2041762935" xmlns="http://jabber.org/protocol/pubsub">,确保XML结构合规后重新解析其中的Base64内容。 - 校验PreKeyBundle构造参数:
- 确认从Bundle中解析出的
signedPreKey、signedPreKeySignature、identityKey是配对的:手动验证签名是由身份私钥对Signed PreKey序列化数据生成的。 - 检查
PreKeyBundle构造函数的参数顺序,避免混淆PreKey ID与Signed PreKey ID,确保每个参数对应正确的数据字段。
- 确认从Bundle中解析出的
- 验证Base64数据完整性:将Bundle中的Base64内容解码,检查是否符合OMEMO Bundle的标准结构(包含身份公钥、Signed PreKey、签名等必填字段),若数据损坏,重新获取正确的Bundle。
- 手动调试签名验证:在本地调用
Curve.verifySignature方法,传入解析出的身份公钥、Signed PreKey序列化数据、签名,定位具体哪部分数据导致验证失败。
内容的提问来源于stack exchange,提问作者AKG
相关产品推荐
相关产品推荐

