Я хочу сохранить что-то в системной цепочке для ключей, но наблюдаю странное поведение. В схеме моего приложения 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
, похоже, не помогает при работе в среде отладки.