使用Scala / Java进行Apple收据验证

时间:2014-11-04 19:24:23

标签: java scala security in-app-purchase

我有一个Scala后端,我想验证应用内购买收据,而不必依赖远程App Store服务,这会引入额外的延迟和额外的故障点。

因此,我想在本地验证收据中包含的PKCS#7签名。

Apple在下面的链接中有关于此主题的一些文档,但它使用的是iOS Objective-C API,并且我在尝试将其映射到Java安全API时遇到了一些麻烦。

Receipt Validation Programming Guide,代码清单1-4:

BIO *b_p7; /* The PKCS #7 container (the receipt) */
PKCS7 *p7; /* and the output of the verification. */

BIO *b_x509; /* The Apple root certificate, as raw */
X509 *Apple; /* data and in its OpenSSL representation. */

/* The root certificate for chain-of-trust verification. */
X509_STORE *store = X509_STORE_new();

/* Initialize b_out as an output BIO to hold the receipt payload */
BIO *b_out = BIO_new(BIO_s_mem());

/* Capture the content of the receipt file. */
p7 = d2i_PKCS7_bio(b_p7, NULL);

Apple = d2i_X509_bio(b_x509, NULL); /* Initialize b_x509 as an input BIO with a value of the Apple */
X509_STORE_add_cert(store, Apple); /* root certificate and load it into X509 data structure. */

/* Verify the signature. If the verification is correct, */
/* b_out will contain the PKCS #7 payload and rc will be 1. */
int rc = PKCS7_verify(p7, NULL, store, NULL, b_out, 0);

我在网上找到了一些解决方案,使用不同的API(Oracle安全性,Sun安全性,Bouncy Castle)以及同一API中的不同方法,但它们似乎都不起作用。对于没有太多安全知识的人来说,似乎没有一个能够弄清楚原因。

让我感到困惑的一件事是,某些方法使用签名和未签名的内容来检查它们是否匹配,但其他方法(包括Apple的代码示例)仅使用签名的证书自行验证签名它。哪种方法是正确的?

是否有人能指出我正确的方向(正确的图书馆,教程,代码示例等)?

谢谢!

0 个答案:

没有答案