iOS:重新签名的应用无法通过安全API访问钥匙串。

6
我们正在为客户编写一款应用程序。我们编译该应用程序并交付给客户一个IPA文件,然后客户使用他们的配置文件和密钥重新签名应用程序。
应用程序在客户重新签署之前可以正常工作。但是,当客户重新签署应用程序后访问密钥链时会出现故障。我们会在设备控制台中收到以下消息:
... SecItemAdd: missing entitlement
... SecItemCopyMatching: missing entitlement

记录我们从所有SecItem *调用中获取的返回代码-25308“不允许与安全服务器交互”。
我没有找到任何遇到这个问题并且解决了的人。
初始构建和后续代码签名都可以正常工作,应用程序运行直到尝试访问钥匙串。重新签名时,客户正在指定与我们最初构建的相同的应用程序ID。我已经添加了证书文件。
我注意到客户使用的预配配置文件中的应用程序ID与应用程序中的ID不同。但重新签名可以工作,并且应用程序可以运行,所以我假设此时这不是问题。
到目前为止还没有成功的方法。
有人遇到过这个问题并解决了吗?

2
客户的配置文件中是否有通配符?此外,在授权清单中,您为钥匙串访问组指定了什么? - borrrden
最后,您的客户端预配配置文件是否与您的预配配置文件使用的数据保护级别匹配? - borrrden
是的,客户端的配置文件是通配符配置文件。应用程序ID为a.b.c.d,而预配配置文件的应用程序标识符为1234XXXX.c.b.a.*,因此存在不匹配的情况。据我所知,数据保护未启用。 - drekka
2
通配符在访问钥匙串的应用程序中是不允许使用的。至少在推送通知和应用内购买方面是这样的,所以这是有道理的。请尝试使用完全限定名称。 - borrrden
如果这并没有帮助到你,那么我猜测可能是因为你的捆绑种子 ID 不同(一个编译进了应用程序,另一个列在嵌入式配置文件中)。请参考此链接 -> http://help.testflightapp.com/customer/portal/articles/402843-mismatched-keychain-access-groups - borrrden
1个回答

6

感谢@borrrden的回复。他们给了我一些很好的指导。

我最终解决了问题。以下是我的发现:

  1. 通配符ID没问题。我使用通配符ID并成功访问了钥匙串。

  2. 问题在于XCode根据编译时知道的ID动态创建了一组授权文件。当重新签名时,配置文件包含一个应用程序ID,而生成的授权文件与之不匹配。因此,iOS不允许访问。

  3. 为了解决这个问题,我创建了一个包含密钥链访问组的授权文件,并让客户在代码签名参数中指定。这个授权文件包含一个与新的配置文件中的应用程序ID相匹配的密钥链访问组。我还必须将正确的团队ID添加到访问组的前面。通常,XCode会自动插入它。

  4. 数据保护与此问题无关。


感谢您指引我正确的方向。我已经修改了一个常用的脚本来自动化代码签名过程:链接 - Sandy Chapman
@drekka,我今天遇到了完全相同的问题,你能指导一下我如何解决问题吗?我看到在第三步几乎有解决方案,但不确定你是如何做到的? - Truong Le
抱歉,这是非常古老的内容,很可能已经不再相关了,而且我们已经很长时间没有需要做类似的事情了。 - drekka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接