Sierra的安全/密码:钥匙串忽略访问控制设置和UI提示以获得许可

从macOS Sierra开始,我无法使用/ usr / bin / security将密码标识导入到密钥链中,而无需使用usr / bin / codesign UI提示使用此标识进行访问。 这打破了构build服务器的打包脚本。 似乎没有解决方法。 这会影响自定义创build的钥匙串,但也会影响login.keychain。

重现步骤:在terminal中执行以下命令(需要签名标识才能导入):

security create-keychain -p test buildagent.keychain security unlock-keychain -p test buildagent.keychain security list-keychains -d user -s buildagent.keychain security default-keychain -s buildagent.keychain security import identity.p12 -k buildagent.keychain -P password -T /usr/bin/codesign codesign -vfs '$IDENTITY' '${PRODUCT}' --keychain 'buildagent.keychain' 

结果:macOS显示一个UI提示,要求获得访问先前导入的私钥的权限。

我已经尝试了很多解决方法,但似乎没有任何工作:

  • 指定钥匙串名称时使用新的.keychain-db扩展名
  • 使用login.keychain而不是自定义的
  • 用-A('允许任何应用程序访问导入的键')导入p12
  • 单独导入证书和密钥(在使用openssl pkcs12之前从p12中提取)

导入标识肯定有效,在Keychain Access应用程序中显示Keychain的内容时,我可以看到证书和密钥。 私钥的访问控制设置也正确configuration(使用期望的代码签名例外规则)。

我怎样才能避免从塞拉利昂的UI提示?

您需要使用的命令如下所示:

security set-key-partition-list -S apple-tool:,apple: -s -k keychainPass keychainName

请记住,这个命令行工具的工作方式就像列表 – 钥匙链的修改方式。 如果使用单个值执行set-key-partition-list,它将覆盖证书中的所有分区ID。 它不会validation通过的值。

该命令的作用是设置可以为特定的钥匙串签名(-s)的密钥的PartitionIDs(用逗号分隔的-S之后的项目)。 允许代码签名的实际分区ID是apple: :。

我不知道apple-tool:是做什么的,因为它没有logging,但是在导入带有security import的密钥后,它在那里,所以我保留它以避免打破复制粘贴命令的人。

这个变化是在Mac OS Sierra中引入的,没有logging(或者至less我找不到文档)。 截至10月16日,安全手册页仍然没有列出这个命令。

欲了解更多信息,你可以参考这个错误报告 – http://www.openradar.me/28524119

对于那些与Travis或其他CI有此问题的人,您必须在应用程序ID列表中添加codesign

security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k keychainPass keychainName

PS:我使用keychainName.keychain(添加.keychain

从这个答案的命令只解锁钥匙串为我,但我仍然有用户界面提示询问当前的应用程序是否可以使用密钥。

我阻止了这样的提示:

进入钥匙串访问中的钥匙串,双击那里的所有钥匙,并在访问控制选项卡中选中“允许所有应用程序访问该项目”。

在这里输入图像描述

我能够将新的钥匙串file upload到我的Jenkins构build服务器,在那里它被Keychain和Provisioning Profiles插件解锁。 构build现在成功签署。