Я создаю связку ключей, а затем добавляю в нее элемент с предопределенным списком доверенных приложений:
SecKeychainCreate([keychainPath UTF8String], (UInt32)strlen(keychainPass), keychainPass, FALSE, NULL, &someKeychain);
OSStatus someStatus = SecKeychainItemCreateFromContent(kSecGenericPasswordItemClass, &list, len, encryptedPass, someKeychain, accessRef, &someKeychainItem);
Когда я открываю только что созданную цепочку для ключей с помощью приложения Keychain Access, я вижу свое приложение в списке доверенных приложений:
Проблема в том, что когда я пытаюсь прочитать ключ из этой связки ключей через одно из доверенных приложений
SecKeychainUnlock(someKeychain, (UInt32)strlen(keychainPass), keychainPass, TRUE);
UInt32 passwordLen = 0;
void *passData = nil;
const char *cUser_name = [NSUserName() cStringUsingEncoding:NSUTF8StringEncoding];
OSStatus genericPassErr = SecKeychainFindGenericPassword(someKeychain, 0, NULL, strlen(cUser_name), cUser_name, &passwordLen, &passData, NULL);
genericPassErr
равно -25293
, что означает Error: 0xFFFF9D33 -25293 The user name or passphrase you entered is not correct.
Ранее в коде я запускаю SecKeychainSetUserInteractionAllowed(0)
, и если я закомментирую эту строку, система запросит у меня разрешение на доступ приложения к связке ключей, и если я его предоставлю, все будет работать нормально. Однако все дело в том, что мне нужно иметь возможность сделать это без запроса пользователя. И я ожидаю, что это будет работать так, как я добавил приложение в ACL. Вы знаете, что я делаю неправильно?
Все работает без подсказки, когда я отмечаю переключатель «все программы имеют доступ к этому элементу» на прикрепленном снимке экрана. Но я не хочу, чтобы у всех был доступ к нему, только к перечисленным приложениям.
/Library
). Что вам кажется лучшим способом запуститьSecKeychainCreate
от имени пользователя root? - person Michał Siwek   schedule 28.06.2014