验证Apple签名遇椭圆曲线点错误,求可用Python实现示例
解决SKAdNetwork签名验证中"Unsupported elliptic curve point type"错误
问题原因
你使用的Apple SKAdNetwork公钥是PKCS#8格式的DER编码Base64字符串,而非裸椭圆曲线点数据,from_encoded_point方法仅用于加载原始的曲线点编码,因此会抛出类型不支持的错误。
正确实现示例
使用cryptography库的load_der_public_key方法加载PKCS#8格式的公钥,以下是可运行的验证代码:
# cryptography==37.0.4 from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.serialization import load_der_public_key import base64 # 替换为实际的SKAdNetwork回传原始JSON字节(不能修改格式、顺序、空格) data = b'{"version":"2.0","ad-network-id":"com.example","campaign-id":123,"transaction-id":"abc123","app-id":"com.example.app","timestamp":1620000000,"redownload":false}' # 替换为实际回传的签名(先做Base64解码) signature = base64.b64decode("实际签名的Base64字符串") # Apple官方提供的SKAdNetwork公钥Base64 public_key_base64 = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdp8GPcGqmhgzEFj9Z2nSpQVddayaPe4FMzqM9wib1+aHaaIzoHoLN9zW4K8y4SPykE3YVK3sVqW6Af0lfx3gg==" public_key_bytes = base64.b64decode(public_key_base64) # 加载PKCS#8格式的公钥 apple_public_key = load_der_public_key(public_key_bytes) try: # SKAdNetwork采用ECDSA-SHA256算法验证签名 apple_public_key.verify( signature, data, ec.ECDSA(hashes.SHA256()) ) print("签名验证成功") except Exception as e: print(f"签名验证失败: {str(e)}")
关键注意事项
- 验证时必须使用回传的原始JSON字符串字节,不能修改任何格式(包括空格、键值对顺序),否则验证会失败。
- SKAdNetwork的签名是ASN.1 DER编码格式,
cryptography的verify方法会自动处理该格式,无需额外转换。 - 确保使用Apple官方发布的SKAdNetwork公钥,格式为PKCS#8 DER Base64。
内容的提问来源于stack exchange,提问作者Danila Ganchar
相关产品推荐
相关产品推荐

