You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在服务器端从Apple App Attest CMS/PKCS7收据提取nonce?

iOS App Attest服务器端验证:收据解析与Nonce提取困境

背景

  • iOS客户端通过DCAppAttestService.shared.generateAssertion(...)生成证明对象,以Base64字符串发送至服务器
  • 服务器解码为二进制后解析为CBOR格式,收据字段位于cborData["attStmt"]["receipt"]

收据结构解析进展

已用Rust的cms、der-parser、x509-parser等crate完成以下操作:

  • Base64解码收据
  • 解析外层PKCS#7 SignedData容器
  • 提取嵌入的eContent(EncapsulatedContentInfo)

核心问题:eContent解析失败

预期eContent中包含对应OID 1.2.840.113549.1.9.7的nonce(又称clientDataHash或challengePassword),但无法提取,原因如下:

  • eContent是带不定长度字段的BER编码二进制Blob,非有效DER格式
  • 无法被der-parser、x509-parser、ciborium或OpenSSL的asn1parse解析,工具提示"too long"或"invalid length"
  • 尝试CBOR解码或回退原始解析,仅得到无意义结构,未找到目标OID对应数据
  • 苹果未公开该ASN.1结构规范,嵌套层级深,无结构定义无法解释内容

已尝试的方法

  • 从CMS信封提取eContent
  • 用der-parser、ciborium及原始解析逻辑尝试解码
  • 尝试CBOR解码(部分值形态类似CBOR整数)
  • 遍历Blob内所有OID,未找到挑战数据
  • 对比GitHub示例及苹果官方文档,无正式ASN.1规范可用

问题的关键影响

若无法在服务器端提取nonce,将无法验证客户端签署的是服务器下发的挑战,无法防范重放攻击,导致验证流程不完整。拒绝从客户端获取nonce,避免客户端篡改风险。

求助需求

  • 是否存在官方/非官方的苹果收据格式ASN.1规范?
  • 有无开发者在不依赖苹果平台API的前提下,在服务器端成功从SignedData payload中提取nonce(clientDataHash)?
  • 是否必须将receipt视为不透明对象,仅依赖签名验证?

环境

  • Rust技术栈,使用cms、der、der-parser、x509-parser等crate
  • 服务器为Linux主机,无法调用苹果平台代码
  • 目标:不依赖客户端返回数据完成nonce验证

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:27