Swift - Службы цепочки для ключей SecKeychainSetDefault терпит неудачу как root - не будет установлен по умолчанию - PullRequest
0 голосов
/ 11 декабря 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...