SecTrustedApplicationCreateFromPath слишком умный? - PullRequest
1 голос
/ 01 апреля 2011

У меня есть приложение, которое также настраивает и запускает демон.Я пытаюсь дать и демону и приложению права доступа к элементу цепочки для ключей.Основной код:

SecKeychainItemRef item;
// create a generic password item
SecTrustedApplicationRef appRef[2];
SecAccessRef ref;
SecTrustedApplicationCreateFromPath( NULL, &appRef[0] );
SecTrustedApplicationCreateFromPath( DAEMON_PATH, &appRef[1] );
CFArrayRef trustList = CFArrayCreate( NULL, ( void *)appRef, sizeof(appRef)/sizeof(*appRef), NULL );
SecAccessCreate( descriptor, trustList, &ref );
SecKeychainItemSetAccess( item, ref );

Запись цепочки для ключей создана, однако единственное приложение, перечисленное в инструменте доступа цепочки для ключей, как всегда имеющее доступ, является основным приложением.Давайте назовем это FOO.app. DAEMON_PATH указывает на абсолютный путь демона, который находится в комплекте приложений - назовите его FOO.daemon.

Если я вручную зайду в Keychain Access и выберу демон, он получитдобавлен в список.

Есть идеи о том, как заставить SecTrustedApplicationCreateFromPath соблюдать полный / абсолютный путь?

1 Ответ

1 голос
/ 22 апреля 2011

Если вам нужен ответ сегодня ...

Я также попытался заменить объект доступа для существующего элемента цепочки для ключей. Поэтому я решил изменить существующий объект доступа, а не заменить его, и этот подход хорошо работает.

Следующий псевдокод демонстрирует идею. Объявления, 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(). Я не мог справиться с этим.

...