【问题标题】:Swift - Keychain Services SecKeychainSetDefault fails as root - Will not set defaultSwift - 钥匙串服务 SecKeychainSetDefault 作为 root 失败 - 不会设置默认值
【发布时间】:2020-04-05 01:00:06
【问题描述】:

我想在系统钥匙串中存储一些东西,但我看到了一些奇怪的行为。在我的应用方案中,我将Debug Process As 设置为root。但是,当我通过SecKeychainCopyDefault 检查默认钥匙串时,它会返回我当前用户的登录钥匙串。

据我所知,将钥匙串项写入特定钥匙串的唯一方法是首先使用SecKeychainSetDefault 将其设置为默认钥匙串,然后执行写入。显然,由于在我的调试环境中默认设置为我的登录链,我需要在尝试写入之前将默认设置为系统钥匙串。我正在执行以下操作来完成此操作:

// Store original default so we can restore it after we are done
var defaultKeychain: SecKeychain? = nil
SecKeychainCopyDefault(&defaultKeychain)

// Open System keychain
let cs = ("/Library/Keychains/System.keychain" as NSString).utf8String
var buffer = UnsafeMutablePointer<Int8>(mutating: cs)!
var systemKeychain: SecKeychain? = nil
SecKeychainOpen(buffer, &systemKeychain)

// Set System keychain to default
var status = SecKeychainSetDefault(systemKeychain)
NSLog(SecCopyErrorMessageString(status, nil) as String? ?? "")

// Ensure default keychain gets reset at end of scope
defer {
    SecKeychainSetDefault(defaultKeychain)
}

// Add item to keychain below
...

但是,我得到以下输出:

Will not set default: UID=0 does not own directory /Users/myuser
2019-12-11 09:54:31.262285-0700 App[99920:12060617] Write permissions error.

似乎即使我的应用程序以root 运行,但由于某种原因我没有对login 钥匙串的写入权限。奇怪的是,当我将我的应用程序部署为后台启动守护程序时,默认钥匙串已经是系统钥匙串,而不是登录钥匙串,并且一切正常。显然,尽管我也希望在我的开发环境中使用这种行为。

我该如何解决这个问题?我需要我的钥匙串项位于系统钥匙串中,但在调试环境中运行时,即使以 root 运行应用程序似乎也无济于事。

【问题讨论】:

    标签: swift macos permissions root keychain


    【解决方案1】:

    以下解决方法对我有用(在 Mac OS 10.15 上):

    在您应用的方案中,将“HOME”环境变量设置为 root 拥有的文件夹(例如 '/' 或 '/var/root')

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多