从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 Access应用程序中显示钥匙串的内容时看到证书和密钥。私钥的访问控制设置也已正确配置(使用所需的代码签名例外规则)。
如何避免来自Sierra的UI提示?
答案 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中的钥匙串,双击其中的所有按键,然后在“访问控制”选项卡中,选中“允许所有应用程序访问此项目”。
我能够将新的钥匙串文件上传到我的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)
在尝试了许多不同的解决方案之后,对我有用的只是更改我的钥匙串的密码。
答案 5 :(得分:1)
下一步使用
security set-key-partition-list -S apple-tool:,apple: -s -k keychainPass keychainName
我还必须将钥匙串的设置更改为“无超时”,
security set-keychain-settings keychainName
答案 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解决方案。