为什么要使用我自己的服务器来验证iOS收据?

mis*_*may 1 security iphone in-app-purchase ios

我想验证iOS收据。

我以为可以将收据发送到App Store验证服务器(https://sandbox.itunes.apple.com/verifyReceipthttps://buy.itunes.apple.com/verifyReceipt)。

但是苹果参考资料说:

无法直接在用户设备和App Store之间建立信任连接,因为您无法控制该连接的任何一端。

苹果建议将收据发送到我的服务器,然后将其发送到App Store验证服务器以进行验证。

https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1

我不明白为什么无论使用HTTPS连接如何,都不信任设备与App Store之间的连接。

Abh*_*ert 5

您的应用程序在用户控制的硬件上运行。他们可以物理访问它,并且可以使用它执行任何操作。操作系统并不能使用户轻松搞乱事情,但是可以做到这一点,黑客也可以做到。

您可以在iOS设备上验证iOS收据。但是您不能确定收据是否有效。用户可能已经入侵了设备,以使您认为收据有效。

我不明白为什么无论使用HTTPS连接如何,都不信任设备与App Store之间的连接。

HTTPS不能保护您免受对iOS设备具有物理控制权的黑客的侵害。黑客可以在设备上安装不同的SSL密钥,从而使其可以与其他服务器连接。

当您的应用尝试与Apple的服务器通信时,任何网络管理员都可以对其进行更改,以便与其他服务器(而不是Apple的服务器)联系。该服务器通常会被拒绝,因为SSL密钥将不受信任...但是,如果用户控制该设备,他们可以使其信任无效的SSL密钥。

但是,您的服务器由您控制。您的客户没有物理访问权限。因此,您的服务器(希望如此)无法被黑客入侵。这意味着您的服务器可以信任,与设备不同。当服务器建立与Apple服务器的SSL连接时,您就知道您确实在与Apple服务器通信。您的用户没有安装绕过应用内购买的产品。

因此,如果用户在您的应用程序中购买了东西……您不想将所购买的东西存储在应用程序中。您希望将其存储在服务器上,并且该服务器仅在与Apple的服务器验证收据后,才将购买的数据发送到设备。

如果您不想花钱运行自己的服务器,那么您只需接受具有几小时空闲时间的任何精通技术的人都可以创建伪造的iOS购买收据,并说服您的设备有效。