【发布时间】: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