应用程序始终要求访问钥匙串的权限

时间:2012-06-27 20:25:36

标签: macos xcode4

我有一个应用程序,用于在钥匙串中存储用户名和密码。在处理Xcode 3时,一切都运行正常,我最近搬到了Xcode 4,现在当我运行应用程序时,我得到一个提示:

Application wants to use your confidential information stored in keychain" in your keychain.

点击后总是允许我看到应用程序被添加到钥匙串项目的访问控制列表中,但每次运行应用程序时都会得到。

再次点击Always allow后,我看到访问控制有两个相同应用的实例。似乎OS认为这是一个新的应用程序。

任何想法都赞赏。

1 个答案:

答案 0 :(得分:4)

我认为问题在于您的签名指定要求导致其不接受自己与其自身“相同的应用程序”(用于钥匙串目的)。

这个的一个常见原因 - 我认为是你的 - 使用的是开发者ID应用程序证书,没有指定的要求,也没有安装中间证书。

标准的开发者ID要求如下所示:

designated => anchor apple generic and 
identifier \"com.example.appName\" and 
((cert leaf[field.1.2.840.113635.100.6.1.9] exists) or 
 (certificate 1[field.1.2.840.113635.100.6.2.6] exists and 
 certificate leaf[field.1.2.840.113635.100.6.1.13] exists  and 
 certificate leaf[subject.OU] = \"1AZBYCXDW9V\" ))

如果您想自己构建此标识符,则必须使用软件包标识符替换标识符,使用cert.OU中的值替换subject.OU。 (如果您在Keychain Access中双击它,它应该被列为组织单位。)然后您可以添加到“其他代码签名标志”:

--requirements "=designated ..." (the whole mess from above)

然而,更好的方法是使用Xcode 4.3.2或更高版本。如果它识别出您正在使用开发者ID应用程序证书,并且可以在钥匙串中看到中间证书,则默认情况下会生成此证书。

此外,如果您使用Xcode中的存档管理器“导出开发人员ID签名的应用程序”,而不是仅使用目标目录中的构建,它将确保签署您的应用程序和任何其他随附的签名,以及它将测试所有设置是否正确。 (失败是相当神秘的 - 例如,你的“选择一个开发者ID来签署”步骤可能没有选择,在syslog中没有任何有用信息的消息 - 但至少它失败或成功的事实缩小了你问题出在哪里。)

无论哪种方式,您都需要从Developer Certificate Utility站点的“开发者ID中间证书”链接下载并安装(在您的构建计算机上)中间证书,称为“开发者ID证书颁发机构”。

最后一件事:即使这解决了您在构建计算机上运行的问题,您也真的想要测试您支持的最旧的操作系统版本。例如,Lion的codeign编译的需求有时无法在Leopard上解析,有时甚至无法在Snow Leopard上解析。如果发生这种情况......请参阅Gatekeeper vs. Leopard: an ongoing tale