如何在服务器端从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
相关产品推荐
相关产品推荐

