如何将eBay PKCS#8格式Ed25519私钥适配Python签名代码?
解决eBay REST API数字签名215122错误的排查方案
1. 私钥提取正确性验证
先确认从PKCS#8格式提取的32字节Ed25519私钥完全正确:
- 使用OpenSSL命令提取时,确保无额外字符干扰:
openssl pkcs8 -in ebay_private_key.p8 -nocrypt -topk8 -outform PEM | grep -v "BEGIN PRIVATE KEY" | grep -v "END PRIVATE KEY" | tr -d '\n' | base64 -d | head -c 32 | xxd -p - 提取后,用Ed25519公钥派生逻辑(从私钥前32字节生成公钥),对比eBay密钥管理API返回的公钥,确保两者一致——这一步能排除私钥提取错误。
2. 待签内容(Signed Content)严格匹配eBay规范
eBay对签名的待签内容格式要求极严,必须完全符合以下规则:
- 按照
signature-input头中声明的组件顺序拼接,比如指定@method @path @authority,就必须按顺序拼接:GET /sell/account/v1/account api.ebay.com - 注意细节:HTTP方法必须大写,路径要包含完整API端点(不能省略前缀),权威部分是
api.ebay.com(不带https://和端口),组件之间用换行分隔,末尾不能多加分隔符。 - 若请求包含body(比如POST/PUT),需确保body的哈希值(如果
signature-input中包含@request-target或body组件)计算正确,且编码为Base64url格式。
3. VBA中签名编码与请求头检查
- Ed25519生成的64字节二进制签名,必须转换为Base64url编码(替换
+为-、/为_,去除末尾所有=),不能用标准Base64。 - 确认
x-ebay-signature-key头的值是eBay返回公钥的Base64url编码,而非原始字节或标准Base64。 - 检查
signature-input中的keyid与eBay密钥的keyId完全一致(区分大小写),created和expires为UTC时间戳(建议设置5-10分钟有效期,避免时间同步问题)。
4. 本地复现与请求发送验证
- 把VBA中生成的待签内容、签名、公钥导出,用RFC8032的Python代码做验证:如果本地验证通过但eBay报错,大概率是VBA发送请求时的编码问题——比如待签内容是否用UTF-8编码,请求头是否存在额外空格或换行。
- 抓包对比请求头:确保
signature-input和signature头没有被VBA的HTTP库自动转义或添加额外字符。
内容的提问来源于stack exchange,提问作者ecom-tech
相关产品推荐
相关产品推荐

