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

时间:2016-10-05 08:07:54

标签: ios macos keychain codesign 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'

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

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

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

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

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

8 个答案:

答案 0 :(得分:130)

您需要使用的命令如下:

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

答案 1 :(得分:28)

对于使用Travis或其他CI遇到此问题的用户,您必须在应用程序ID列表中添加codesign

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

P.S: 我使用keychainName.keychain(添加.keychain

答案 2 :(得分:26)

来自this answer的命令只为我解锁了钥匙串,但我仍然有UI提示,询问当前应用程序是否可以使用该密钥。

我阻止了这样的提示:

转到Keychain Access中的钥匙串,双击其中的所有按键,然后在“访问控制”选项卡中,选中“允许所有应用程序访问此项目”。

enter image description here

我能够将新的钥匙串文件上传到我的Jenkins构建服务器,然后由Keychains and Provisioning Profiles Plugin解锁。现在,构建成功签署。

答案 3 :(得分:4)

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

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

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A

之后无需使用security set-key-partition-list

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

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

security list-keychains -s ${KEYCHAIN_PATH}

然后解锁钥匙串。否则,将显示询问钥匙串密码的提示:

security unlock-keychain -p ${KEYCHAIN_PASSWORD} ${KEYCHAIN_PATH}

最终应禁用自动锁定超时。这是为了防止构建很长并且钥匙串重新锁定自己:

security set-keychain-settings ${KEYCHAIN_PATH}

答案 4 :(得分:1)

在尝试了许多不同的解决方案之后,对我有用的只是更改我的钥匙串的密码。

  • Finder>去>应用
  • 打开Keychain Access实用程序。
  • 不确定是否需要执行此步骤:在Keychain Access实用程序的左侧边栏中,单击“我的证书”。查看Keychain列以确认您的Apple开发人员证书所在的Keychain。在我的情况下,它位于" login"钥匙串。
  • 更改上一步中钥匙串的密码。如果它被锁定,你可能想尝试锁定它然后解锁它。您可以通过单击相关的钥匙串("登录",在我的情况下)更改密码,然后选择"更改密码..."从Keychain Access实用程序的“编辑”菜单中。
  • 下次我在Xcode中运行存档步骤(在产品菜单中)时,我最终被提示输入一个钥匙串密码,我输入了我的"登录"钥匙扣。然后它奏效了。完成后,我看到了一个Archives屏幕,其中列出了我的应用程序。

答案 5 :(得分:1)

下一步使用

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

我还必须将钥匙串的设置更改为“无超时”,

security set-keychain-settings keychainName

(文档位于https://ss64.com/osx/security-keychain-settings.html

答案 6 :(得分:0)

我花了几天时间寻找解决方案。这没有帮助

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -A

但是当我明确列出应用程序时-它有效(至少在Catalina上有效!)!

security import ${P12_FILE} -k ${KEYCHAIN_PATH} -P ${P12_PASSWORD} -T /usr/bin/codesign -T /usr/bin/productsign

答案 7 :(得分:-2)

此外,如果您的应用程序构建超过5分钟 - 您可能会用完自定义钥匙串锁定计时器并收到-1 = ffffffff错误。因此禁用钥匙串锁作为tmp解决方案。