【发布时间】:2020-08-18 17:47:37
【问题描述】:
由于某些原因,我必须在没有支付平台的情况下处理 Apple Pay 支付令牌。根据official document,我需要先“验证签名”。并且签名是一个分离的 PKCS #7 签名,采用 base64 编码。我想用 node.js 或 openssl 验证它。
由于 node-forge,一个非常方便的加密工具,还不支持“带有 sha256 的 ECDSA”(link),我找不到其他替代品。我转向openssl。经过一番调查,似乎签名以“CMS 签名数据”格式打包。所以我发现openssl手册中的这个命令应该可以完成这项工作:
openssl cms -verify -inform DER -in signature.der -content content.txt
Apple 文档说“确保签名是 ephemeralPublicKey、data、transactionId 和 applicationData 键的串联值的有效 ECDSA 签名”。所以我通过从我的测试令牌中连接这些字段来生成我的测试内容。但结果是:
Verification failure
C0:25:34:08:01:00:00:00:error:CMS routines:CMS_SignerInfo_verify_content:verification failure:crypto/cms/cms_sd.c:901:
C0:25:34:08:01:00:00:00:error:CMS routines:CMS_verify:content verify error:crypto/cms/cms_smime.c:399:
cms_sd.c:901 是签名者验证 igest 所以我认为这个命令是我需要的。那我做错了什么?
更新:我发现PKI.js 可以完成这项工作。详细答案如下。
【问题讨论】: