Sierra中的安全性/协同设计:Keychain忽略访问控制设置和UI提示以获得许可

Sve*_*ker 68 macos keychain codesign ios macos-sierra

从macOS Sierra开始,我无法在没有usr/bin/codesign UI的情况下使用/ usr/bin/security将codeign-identity导入到钥匙串中,以便在使用此标识时提示访问.这打破了构建服务器的打包脚本.似乎没有解决方法.这会影响自定义创建的钥匙串,但也会影响login.keychain.

重现步骤:在终端中执行以下命令(要求签名标识可用于导入):

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'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 指定keychain-name时使用新的.keychain-db扩展名
  • 使用login.keychain而不是自定义的
  • 使用-A导入p12('允许任何应用程序访问导入的密钥')
  • 单独导入Cert und Key(使用openssl pkcs12从p12中提取)

导入身份肯定有效,我可以在Keychain Access应用程序中显示钥匙串的内容时看到证书和密钥.私钥的访问控制设置也已正确配置(使用所需的代码签名例外规则).

如何避免来自Sierra的UI提示?

Ili*_*iev 133

您需要使用的命令如下:

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

请记住,此命令行工具的工作方式与list-keychains的修改方式类似.如果使用单个值执行set-key-partition-list,它将覆盖证书中的所有partitionID.它不会验证传递的值.

此命令的作用是它为可以为特定钥匙串签名(-s)的键设置PartitionID(-S之后用逗号分隔的项).允许进行协同签名的实际分区ID是apple:.

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

此更改是在Mac OS Sierra中引入的,未记录(或者至少我找不到文档).截至10月16日,安全性手册页仍未列出此命令.

有关更多信息,请参阅此错误报告 - http://www.openradar.me/28524119

  • 我反向设计了安全命令行工具,keychain UI工具和securityd.另外,我使用Apple Mac OS测试团队的acltool来打印他们工具设置的当前partitionID.AclTool的源代码可以在这里找到 - https://opensource.apple.com/source/Security/Security-57337.60.2/SecurityTests/cspxutils/ (41认同)
  • @ElliotNelson在莫哈韦以同样的方式工作.刚刚完成了新的设置. (3认同)

Raf*_*ado 29

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

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

PS:我正在使用keychainName.keychain(添加.keychain)

  • 这不适合我.它似乎只是转储我的钥匙串.当我尝试使用`codesign --force --sign <identity_hash> $(mktemp)`进行测试时,我仍然可以获得批准对话框 (2认同)

Wou*_*ter 29

这个答案中的命令只为我解锁了钥匙串,但我仍然有UI提示询问当前应用程序是否可以使用该密钥.

我阻止了这样的提示:

转到Keychain Access中的钥匙串,双击那里的所有按键,然后在"访问控制"选项卡中,选中"允许所有应用程序访问此项".

在此输入图像描述

我能够将新的钥匙串文件上传到我的Jenkins构建服务器,在那里它由Keychains和Provisioning Profiles插件解锁.现在,构建成功签署.

  • 这个答案值得更多的赞成.除非将访问控制设置为允许所有应用程序,否则所有其他解决方案仍然无效. (3认同)

Ika*_*Ika 7

出于某种原因,这security set-key-partition-list对我不起作用。

我在钥匙串中导入证书时使用 -A 选项解决了这个问题:

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A
Run Code Online (Sandbox Code Playgroud)

没有必要使用security set-key-partition-listafter。

此选项允许任何应用程序在没有警告的情况下访问导入的密钥。因此,它可以防止提示出现。请注意,它是不安全的,因为密钥不受保护,但根据您的构建上下文,它可能会有所帮助。

最重要的是,钥匙串必须添加到搜索列表中:

security list-keychains -s ${KEYCHAIN_PATH}
Run Code Online (Sandbox Code Playgroud)

然后应该解锁钥匙串。否则将显示要求输入钥匙串密码的提示:

security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}
Run Code Online (Sandbox Code Playgroud)

最终应禁用自动锁定超时。这是在构建很长并且钥匙串重新锁定自身的情况下:

security set-keychain-settings ${KEYCHAIN_PATH}
Run Code Online (Sandbox Code Playgroud)