Php 应用内购买(沙盒)-由于curl/SSL,收据验证失败

Php 应用内购买(沙盒)-由于curl/SSL,收据验证失败,php,ios,curl,in-app-purchase,sandbox,Php,Ios,Curl,In App Purchase,Sandbox,我注意到,我的服务器端收据验证代码仅在沙箱中失败(商店中我的应用程序的实时版本工作正常,但在我测试下一个版本的Xcode上,收据验证总是失败) 我将问题跟踪到了php/curl代码,在那里我联系了iTunes服务器(https://sandbox.itunes.apple.com/verifyReceipt),我从curl得到这个错误: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:

我注意到,我的服务器端收据验证代码仅在沙箱中失败(商店中我的应用程序的实时版本工作正常,但在我测试下一个版本的Xcode上,收据验证总是失败)

我将问题跟踪到了
php/curl
代码,在那里我联系了iTunes服务器(
https://sandbox.itunes.apple.com/verifyReceipt
),我从
curl
得到这个错误:

SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:func(144):reason(134)
我想知道这是否和那个俄罗斯人和他的黑客有关。。。 但这只发生在我的沙盒代码中。现场版本似乎正在运行

有什么线索吗

也许我应该在沙盒和live中使用“live”iTunes服务器,如下所述?

(没有意识到这一变化,还可以吗?)


编辑我修改了我的沙盒php代码以使用实时iTunes服务器(URL:
https://buy.itunes.apple.com/verifyReceipt
)和测试用户购买/回购现在正在运行。我仍然很困惑。。。沙盒服务器是否已被弃用?它是否使用与live environment不同的SSL证书来标识自己,哪个证书已被吊销?

看起来苹果最近重新为Sandbox使用了SSL证书,并且该证书已使用主题替代名称域Sandbox.itunes.Apple.com正确签名。但是没有使用正确的URL进行签名(或者只是使用了Live中的URL,而没有使用沙盒)。他们改为在buy.itunes.apple.com上签名,这打破了任何cURL请求(我们的服务器也有同样的问题)。作为目前的解决办法,我们使用了以下选项:

if($isSandbox)curl\u setopt($ch,CURLOPT\u SSL\u VERIFYPEER,false)

这将关闭SSL验证,因此请谨慎使用,因为它可能导致中间人攻击。我不认为这在沙盒上有什么大不了的,因为它是在测试环境中测试用户的

编辑:

事实上,苹果指出,在7.18.0之前安装默认cURL的CA证书包已经严重过时

我们最近可能有一个服务器更新破坏了我们的cURL安装,但我不是我们的系统管理员,所以我真的不确定。但是看看这个链接,因为它包括我上面提到的解决方法(#1)和一些其他选项,包括更新CA证书包

编辑:

我想在这里添加另一个旁注。在cURL版本7.19.7中,似乎有一个bug修复程序处理了主题替代名称

  • libcurl OpenSSL无法验证某些具有主题替代名称的证书
所以这实际上可能是部分苹果,部分卷曲。苹果使用SAN进行的证书更新可能会破坏7.19.7以上版本的任何内容。我们仍在测试服务器上是否存在这种情况

编辑:

我们发现问题不是我们使用的cURL版本,而是我们需要cURL指向的CA-cert-pem文件。通过上面的cURL链接,它是#2,但在PHP中,它是这样的:

if($isSandbox)curl_setopt($ch,CURLOPT_CAINFO,'/etc/ssl/certs/cacert.pem')


您可以从

获取最新的CA cert pem文件您是否尝试过在不使用SSL的情况下访问沙箱url?您的意思是“http”而不是“https”?不这样做有什么好处吗?是的,没关系。。没有httpsI就不能工作意味着,SSL的全部目的是防止中间人攻击和类似的攻击,对吗?但现在我想起来了,这是沙箱,所以应该没问题…?哦,好的。你现在有沙盒IAP应用程序在工作吗?谢谢。。。我在怀疑这类事情。不管是不是沙箱,去映射SSL都不正确。。。使用buy.itunes作为沙盒收据有什么缺点吗?(除了加载live server)嗯,我不确定您是否可以使用live server验证沙盒收据。我试了一下我的设备,但收到的收据无效。这就是为什么我告诉cURL不要验证SSL证书。更正:它对我有效(现在,所有沙盒收据都无效)。我浏览了一下你的链接,但没有完全理解(这里是计算机制图的家伙)。我将尝试您的php代码段…我将尝试.pem版本。但是我在一个共享服务器上(我想我无法访问/etc/ssl/)。我应该把.pem文件放在哪里?是否应该对其进行保护?现在我遇到了以下错误:
设置证书验证位置时出错:CAfile:/test/service/mobile/delivery/support/cacert.pem CApath:none