Teamcity:Mac构建代理无法使用productsign签署.pkg文件。 SignData失败:CSSMERR_CSP_NO_USER_INTERACTION(-2147415840)

时间:2016-10-05 18:34:16

标签: bash macos teamcity keychain productsign

情境:

我的TeamCity构建完成后,我需要使用TeamCity对.pkg文件进行签名。

理想情况下,这可能是最后运行的构建步骤或脚本。经过研究,我尝试了以下方法:

脚本输入:

security import applicationkey.p12 -k login.keychain -P "password"

security import installerkey.p12 -k login.keychain -P "password"

security -v unlock-keychain -p "password" /Users/administrator/Library/Keychains/login.keychain

security -v unlock-keychain -u /Library/Keychains/System.keychain

productsign --keychain /Users/administrator/Library/Keychains/login.keychain --sign 'Developer ID Installer: Company LLC' CompanyInstaller.pkg CompanyInstallerSigned.pkg

pkgutil --check-signature CompanyInstallerSigned.pkg

输出:

unlock-keychain "-p" "mypassword" "/Users/administrator/Library/Keychains/login.keychain"

unlock-keychain "-u" "/Library/Keychains/System.keychain"

productsign: using timestamp authority for signature

productsign: signing product with identity "Developer ID Installer: Company LLC" from keychain /Users/administrator/Library/Keychains/login.keychain

productsign: adding certificate "Developer ID Certification Authority"

productsign: adding certificate "Apple Root CA"

2016-10-05 14:57:11.484 productsign[9385:29611120] SignData failed: CSSMERR_CSP_NO_USER_INTERACTION (-2147415840)

Error signing data.

productsign: error: Failed to sign the product.

问题:

我注意到有很多解决方法可以点击"始终允许"第一次出现在Keychain访问控制的引用中时,从对话框提示开始,但我与该构建代理的唯一已知交互是通过SSH。 是否有办法在Teamcity mac build代理上使用productsign签署.pkg而无需与此进行gui交互"始终允许"提示?或者,有没有办法登录到构建代理并查看gui所以我可以点击这个" Always Allow"启用此功能?

注意:我还尝试将(本地签名机)私钥的访问控制保存到"允许所有应用程序访问此项",导出它,将其导入构建代理程序的login.keychain,然后再次尝试上面的操作,只有相同的输出。当我在我的macbookpro上执行相同的过程时,一切正常,但是我不记得我是否点击过" Alway Allow"从很久以前。

有什么想法?非常感谢。

1 个答案:

答案 0 :(得分:1)

我们也遇到了这个问题 - 我们正在使用TeamCity在Mac构建代理上签名包。

我们第一次设置构建代理时,我们将证书导入到钥匙串中并授予“始终允许”权限;这似乎有效。在某些时候,构建代理程序重新启动,然后签署程序包不再有效,无论我们如何尝试使用权限&信任设置。我们不断收到SignData failed: CSSMERR_CSP_NO_USER_INTERACTION错误。

我们通过将证书移动到“系统”钥匙串(之前在“登录”中)钥匙串来修复此问题(希望是好的!)。我们根本不需要将呼叫更改为productsign - 它正确地选择了系统密钥链。我想如果你在两个钥匙串中都有证书,那么你需要告诉productsign使用哪个钥匙串(--keychain ...)。