摘要

  • RFC 3923 先用 S/MIME 保护 CPIM 消息对象,再把它放入 XMPP 的 封套;这个封套的命名空间本身不定义消息语义。
  • XMPP-CPIM 网关可以移除或添加服务外壳以完成转送,但必须原样保留受保护对象。

网关获准进行的修改

网关让使用不同协议的即时通信服务能够交换消息。但只要中间环节开始转换消息,就会出现安全问题:它可以改动什么,又不会因此成为信任边界的一部分?2004 年 10 月发布的 IETF 标准 RFC 3923 给出了一个刻意狭窄的答案。XMPP-CPIM 网关可以拆掉一种服务的封套,再套上另一种服务的外壳;它不能改动内部已经签名或加密的 S/MIME 对象。

这条边界使端到端保护至少能在协议接口上与双向理解服务的中介并存。网关不是密码学终端,而是把受保护对象当作不透明载荷转运。架构因此把互通工作与签名、加密、解释内容的工作分开。

XMPP stanza 内的受保护对象

发送方先生成 Message/CPIM 对象。它既含消息头,也含正文;RFC 3923 要求二者都纳入 S/MIME 签名或加密。生成的对象随后放入 XML CDATA 区段,再置于 XMPP message 或 presence stanza 的 <e2e/> 子元素中。某些场景下,封装对象也可以是 PIDF presence 文档或 XMPP XML 对象。

<e2e/> 负责承载,不负责解释。RFC 3923 说明,它的命名空间没有内在语义;CPIM、PIDF 或 XMPP 各自的规范才定义被封装对象的意义。这样,中介即使能解析承载它的 XMPP stanza,也不必理解受保护的内容。

网关规则由此而来。消息从 XMPP 发往非 XMPP 服务时,网关移除 XMPP 封套(包括 <e2e> 标签),取出 multipart S/MIME 对象并路由;必要时再加上目标服务的外壳。反向传送时,网关移除非 XMPP 外壳,把同一个对象置入 XMPP 封套,然后路由 stanza。RFC 明确要求,被封装的 S/MIME 对象必须保持不变,XMPP-CPIM 网关不得修改它。

一条边界,不是完整安全体系

不可变是明确的协议要求,却不能证明实际部署的网关遵守了它。封套也不会自动让周边事实可信。接收方仍要取得并验证证书,还要判断签名究竟能证明发送者的什么身份。RFC 3923 没有规定证书如何登记,只要求接收代理提供证书获取机制。因此,它承诺的是在一条特定互通路径上保存受保护对象,而不是解决身份、密钥分发或用户界面问题。

这一设计也暴露了实际取舍。不透明转运可以让中介承载自己不应随意改写的内容,但会限制内容转换和检查。如果服务必须转换内容,转换发生在哪里、会怎样影响签名,就变得关键。修改签名覆盖的对象不是中性翻译;RFC 把这种决定留给通信端点。

十年后,RFC 7165 称 S/MIME 方案尚未获得广泛部署,并将密钥管理挑战与 S/MIME 对象难以处理列为部分原因。这是 2014 年规范文档中的历史判断,不是当前使用情况普查,也不是单一因果解释。但它凸显了一条历史经验:清晰的协议边界可以保住密码学意义,却不一定让产品和密钥管理变得容易。RFC 3923 的长久意义不是让网关变得可信,而是说明互通不必以重写端点所保护的内容为代价。

来源