Sierra 中的安全/协同设计:钥匙串忽略访问控制设置和 UI 提示权限

Posted

技术标签:

【中文标题】Sierra 中的安全/协同设计:钥匙串忽略访问控制设置和 UI 提示权限【英文标题】:security / codesign in Sierra: Keychain ignores access control settings and UI-prompts for permission 【发布时间】:2017-02-13 13:55:56 【问题描述】:

从 macOS Sierra 开始,在使用此身份时,如果没有 usr/bin/codesign UI 提示进行访问,我将无法再将 codesign-identity 导入带有 /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 ('允许任何应用程序访问 导入的密钥') 单独导入证书和密钥(正在提取 从 p12 之前使用 openssl pkcs12)

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

如何避免 Sierra 的 UI 提示?

【问题讨论】:

目前我发现我必须打开一次 UI 并单击 Always allow 然后 CLI 运行良好。 嗨 jayatubi,如果您只使用几个 Codesign 身份和相同的钥匙串(例如 login.keychain),这是一个可行的解决方案。但是我的公司必须管理数十种不同的 Codesign 身份,并且更喜欢使用每个构建的钥匙串,因为这消除了在同一个钥匙串中提供多个名称相似的身份时破坏构建的风险。 我注意到一件奇怪的事情。当 UI 提示时,它会询问 permission of private XXX。但是,XXX 不是私钥的名称,而是p12 文件的名称。如果我在同一个 p12 文件中有多个键,无论我使用哪个键,它总是显示 p12 文件的名称。如果我点击always allow 相同 p12 中的所有键都可以进行协同设计。 就我而言,问题是我是通过 SSH 进行的 【参考方案1】:

你需要使用的命令如下:

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

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

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

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

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

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

【讨论】:

非常感谢,这工作得很好!你是怎么想到这个的?在搜索 set-key-partition-list 时,唯一的结果是这个站点和引用的雷达 :) 我对安全命令行工具、钥匙串 UI 工具和 securityd.此外,我使用了 Apple Mac OS 测试团队的 acltool 来打印他们的工具设置的当前 partitionID。 AclTool 的源代码可以在这里找到 - opensource.apple.com/source/Security/Security-57337.60.2/… 是否有一个 get-partition-list 可以查看当前设置的内容? @ElliotNelson 在 High Sierra 以同样的方式工作。今天刚刚完成了新设置。 @ElliotNelson 在莫哈韦以同样的方式工作。今天刚刚完成了新设置。【参考方案2】:

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

我阻止了这样的提示:

进入钥匙串访问中的钥匙串,双击那里的所有钥匙,然后在“访问控制”选项卡中,选中“允许所有应用程序访问此项目”。

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

【讨论】:

这个答案值得更多的支持。除非将访问控制设置为“允许所有应用程序”,否则所有其他解决方案仍然无法工作。【参考方案3】:

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

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

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

【讨论】:

这对我不起作用。它似乎只是转储我的钥匙串。当我尝试使用codesign --force --sign <identity_hash> $(mktemp) 对其进行测试时,我仍然得到批准对话框 这仅适用于临时钥匙串吗?我正在尝试使用我的登录钥匙串来做到这一点。 我最初导入私钥时没有包含我的钥匙串密码,这导致set-key-partition-list 不起作用。 ***.com/a/43002580/9636 这对我来说不适用于 CircleCI。代码签名命令挂起(因为操作系统要求输入密码)。有效的是上面 Ilian Iliev 的回答。【参考方案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

【讨论】:

有趣。在 16 年 10 月的 Sierra 中,这对我不起作用。你在哪个操作系统上测试过这个? 在运行 Sierra 10.12.6 的 Jenkins slave 上进行了测试【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

接下来使用

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 获取文档)

【讨论】:

以上是关于Sierra 中的安全/协同设计:钥匙串忽略访问控制设置和 UI 提示权限的主要内容,如果未能解决你的问题,请参考以下文章

访问钥匙串中的安全项目有时会在 iOS 中返回错误 -25308 (errSecInteractionNotAllowed)

NSSecureCoding 与钥匙串

使用钥匙串提高 iOS 应用程序的安全性

Mac钥匙串有啥用?钥匙串访问是啥

iOS 钥匙串安全性

PhoneGap 构建 iOS 钥匙串访问?