当前位置: 首页 > 知识库问答 >
问题:

验证apple pay支付令牌签名

何高歌
2023-03-14

因为node-forge(一个非常方便的加密工具)还不支持“ECDSA with SHA256”(链接),我找不到其他替代品。我转向OpenSSL。经过一些调查,签名似乎是以“CMS签名数据”格式打包的。所以我发现openssl手册中的这个命令应该可以完成以下任务:

openssl cms-verify-informed 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可以完成这项工作。详细解答如下。

共有1个答案

松博耘
2023-03-14

下面的pki.js示例中的代码片段展示了如何解析现有的CMSSignedData。

const testData = "<TOKEN_SIGNATURE>";

const cmsSignedBuffer = stringToArrayBuffer(fromBase64(testData));
const asn1 = asn1js.fromBER(cmsSignedBuffer);
const cmsContentSimpl = new ContentInfo({ schema: asn1.result });
const cmsSignedSimpl = new SignedData({ schema: cmsContentSimpl.content });

在此之后,我们可以提取证书和签名者的信息,以供进一步处理。

检查OID:

cmsSignedSimpl.certificates[0].extensions.find(x => x.extnID === '1.2.840.113635.100.6.29') // leaf certificate
cmsSignedSimpl.certificates[1].extensions.find(x => x.extnID === '1.2.840.113635.100.6.2.14') // intermediate certificate
cmsSignedSimpl.verify({
    signer: 0,
    trustedCerts: [AppleRootCA_G3],
    data: signedData,
    checkChain: true, // check x509 chain of trust
    extendedMode: true, // enable to show signature validation result
  });
const attrs = cmsSignedSimpl.signerInfos[0].signedAttrs.attributes;
const signingTimeAttr = attrs.find(x => x.type === '1.2.840.113549.1.9.5');
const signingTime = new Date(signingTimeAttr.value[0].toDate());
 类似资料:
  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT

  • 我正在制作一个javascript客户端,它使用JWT令牌连接到Api。在服务器端没有问题,我可以创建令牌对其进行签名,然后验证签名,从而确保没有人篡改令牌。 但我如何在客户端做到这一点。我可以解码JWT令牌并查看头、负载和签名。但是如何在客户端验证签名?是否有用于此的库,如何将公钥传输到客户端? 如果我不验证签名,我怎么知道令牌没有被篡改?

  • 链接是:https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/#look-up-a-payment-using-the-rest-api 谢谢你的建议

  • 首先使用stripe验证信用卡,然后生成令牌并创建客户。我们将把代币而不是信用卡信息保存在数据库中,以后我们将根据代币或客户而不是信用卡信息向客户付款。 在javscript文件中,我们如何处理和? 因为我们已经使用 1-通过验证信用卡信息保存令牌,在这种情况下不涉及支付。金额/价格将为零(0)。 2-将此内标识保存在数据库中,但此内标识只使用一次,使用次数不多。如果以后再使用此内标识,将不起作用

  • 问题内容: 我正在努力验证Azure AD令牌签名。 当我在下面的“ jwks_uri”字段中查找正确的键描述时 https://login.microsoftonline.com/common/.well-known/openid- configuration 我检查所属密钥数据。 我尝试使用“ n”-模数和“ e”字段生成用于签名验证的公钥,但最终出现错误: 安慰: 我尝试了另一种使用“ x5

  • 在任何给定的POD中,服务帐户令牌被挂载在位置。 /var/run/secrets/kubernetes.io/serviceaccount/token 我想了解这个令牌是如何签名的。Kubernetes在签名此令牌时使用什么密钥?如何访问有助于脱机签名验证的公钥 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt-我尝试使用与此证书关联的公钥