Если вам нужен ответ сегодня ...
Я также попытался заменить объект доступа для существующего элемента цепочки для ключей. Поэтому я решил изменить существующий объект доступа, а не заменить его, и этот подход хорошо работает.
Следующий псевдокод демонстрирует идею. Объявления, CFRelease () и проверка ошибок убраны для ясности.
SecKeychainItemCopyAccess(item, &accessObj);
SecAccessCopySelectedACLList(accessObj, CSSM_ACL_AUTHORIZATION_DECRYPT, &aclList);
assert(CFArrayGetCount(aclList) == 1);
acl = (SecACLRef)CFArrayGetValueAtIndex(aclList, 0);
SecACLCopySimpleContents(acl, &appList, &desc, &prompt_selector);
SecTrustedApplicationCreateFromPath(MY_APP_PATH, &app);
newAppList = CFArrayCreate(NULL, (const void**)&app, 1, NULL);
SecACLSetSimpleContents(acl, newAppList, desc, &psel);
SecKeychainItemSetAccess(item, accessObj);
Я использовал SecAccessCopySelectedACLList
для поиска объекта ACL с соответствующим тегом авторизации. Вам может потребоваться другой способ фильтрации ACL.
Простое создание объекта доступа должно быть более сложным, вы должны создать ту же структуру ACL, что и приложение Keychain Access, вместо того, чтобы использовать ACL по умолчанию SecAccessCreate()
. Я не мог справиться с этим.