如何允许所有应用程序在没有提示的情况下访问keychain项目

sol*_*gar 7 macos keychain

可以选择Keychain Access允许所有应用程序无限制地访问钥匙串项. 钥匙串访问 - 访问控制选项卡

我不知道如何以编程方式设置它.我试图用空ACL创建和设置新的SecAccessRef,并没有真正改变任何东西(使用SecItemUpdate更新kSecAttrAccess).我还尝试获取项目的所有授权标记的所有ACL列表,并将ACL内容设置为该ACL /标记组合的空数组.我能够清除允许的应用列表,但这不允许所有应用程序无限制地访问项目.我没有看到使用keychain api设置它的方法.

所以我的问题是如何操纵Access对象或其ACL以允许不受限制地访问钥匙串项或至少不受限制的读取?

Mik*_* C. 5

根据我的经验,安全 API 中大多数最新的“便捷”方法都将项目存储到钥匙串中:

  • SecKeychainAddGenericPassword()
  • SecKeychainAddInternetPassword()
  • SecKeyGeneratePair()

在密码、私钥上添加change_acl授权 ACL 条目,并使用空的受信任应用程序数组 - 这意味着没有用户提示,任何应用程序都无法随后修改 ACL。

因此,一般来说,如果没有用户提示,您似乎无法修改大多数现有钥匙串项目上的 ACL。

但是,如果您使用较旧的 Security API 方法将项目添加到钥匙串(您可以向其提供SecAccessRef您自己创建的项目):

  • SecKeychainItemCreateFromContent()
  • SecKeyCreatePair()(在 OS X 10.7 中已弃用,但仍然有效)

那么您可以有效地将这些项目设置为“允许所有应用程序访问此项目”,这可能很有用,具体取决于您的应用程序。

也就是说,对于这些旧函数,您可以:

  1. 创建一个SecAccessRef使用SecAccessCreate()SecAccessCreateWithOwnerAndACL()
  2. 使用以下命令将单个 ACL 添加到SecAccessRef授权Any、无提示行为 ( SecKeychainPromptSelector = 0) 和受信任的应用程序列表NULLSecACLCreateWithSimpleContents()
  3. 使用上述API创建钥匙串项时传递SecAccessRef,以实现“允许所有应用程序访问该项”