Sierra中的安全性/代码签名:钥匙串忽略访问控制设置和用户界面提示以获取许可


71

从macOS Sierra开始,如果没有usr / bin / codesign UI提示使用此身份进行访问的提示,我将无法再使用/ usr / bin / security将代码符号身份导入到钥匙串中。这破坏了构建服务器的打包脚本。似乎没有解决方法。这会影响自定义创建的钥匙串,还会影响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-db扩展名
  • 使用login.keychain代替自定义的
  • 用-A导入p12(“允许任何应用程序访问导入的密钥”)
  • 分别导入证书和密钥(在使用openssl pkcs12之前已从p12中提取)

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

如何避免Sierra的UI提示?


目前,我发现必须打开一次UI并单击,Always allow然后CLI才能正常运行。
jayatubi

嗨,jayatubi,如果您仅使用少数几个Codesign身份和相同的钥匙串(例如,login.keychain),那么这是一个可行的解决方案。但是我的公司必须管理数十个不同的Codesign身份,并且更喜欢使用每构建密钥链,因为这消除了在同一密钥链中可以使用多个相似命名的身份来破坏构建的风险。
Sven Driemecker '16

我注意到一件奇怪的事。当用户界面提示时,要求输入permission of private XXX。但是,XXX不是私钥的名称,而是p12文件的名称。如果同一p12文件中有多个键,无论我使用哪个键,它都始终显示p12文件的名称。如果我单击always allow同一p12中的所有键,则可以进行代码签名。
jayatubi

就我而言,问题是我正在通过SSH进行操作
Dawid Drozd

Answers:


146

您需要使用的命令如下:

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

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

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

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

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

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


1
非常感谢你,这一切都很好!您是怎么想到的?搜寻set-key-partition-list时,唯一的结果是该站点和所引用的雷达:)
Sven Driemecker

47
我对安全性命令行工具,钥匙串UI工具和安全性进行了反向工程。另外,我使用了Apple Mac OS测试团队的acltool来打印由其工具设置的当前partitionID。AclTool的源代码可以在这里找到- opensource.apple.com/source/Security/Security-57337.60.2/...
莉莲·利维

1
是否有一个get-partition-list来查看当前预先设置的内容?
Jeef

1
@ElliotNelson在High Sierra的工作方式相同。就在今天完成了新的设置。
miguelr 18/09/17

3
@ElliotNelson在莫哈韦沙漠以同样的方式工作。就在今天完成了新的设置。
Yuchen Zhong

31

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

我阻止了这样的提示:

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

在此处输入图片说明

我能够上载新的钥匙串文件,然后将其上传到我的Jenkins构建服务器,该服务器通过“钥匙串”和“供应配置文件插件”进行解锁。现在,该构建成功签名。


3
这个答案值得更多的赞扬。除非将访问控制设置为“允许所有应用程序”,否则所有其他解决方案仍然无法使用。
Pat Butkiewicz

29

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

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

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


2
这对我不起作用。好像只是丢了我的钥匙串。当我尝试使用进行测试时codesign --force --sign <identity_hash> $(mktemp),我仍然会看到批准对话框
Heath Borders'Mar

这仅适用于临时钥匙串吗?我正在尝试使用我的登录钥匙串来做到这一点。
Heath Borders

最初导入私钥时,我没有包括钥匙串密码,这导致set-key-partition-list无法正常工作。stackoverflow.com/a/43002580/9636
希思·边界

1
对于CircleCI,这对我不起作用。代码签名命令挂起(因为os正在要求输入密码)。起作用的是上面Ilian Iliev的答案。
AlunAlun

6

由于某种原因,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}

有趣。那时在16年10月与Sierra合作时,这对我没有用。您在哪个操作系统上对此进行了测试?
Sven Driemecker

它在运行Sierra 10.12.6的Jenkins奴隶上进行了测试
Ika,

1

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

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


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

-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.