SecTrustedApplicationCreateFromPath太聪明了?

时间:2011-04-01 18:31:45

标签: xcode keychain

我有一个应用程序,它也配置并运行一个守护进程。我试图给守护进程和应用程序访问钥匙串项目的权限。基本代码:

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 );

创建了钥匙串条目,但是Keychain Access工具中列出的唯一始终具有访问权限的应用程序是主应用程序。我们称之为FOO.app。 DAEMON_PATH 指向应用程序包中守护程序的绝对路径 - 将其称为FOO.daemon

如果我手动进入Keychain Access并选择守护进程,它会被添加到列表中。

有关如何让SecTrustedApplicationCreateFromPath遵守完整/绝对路径的任何想法吗?

1 个答案:

答案 0 :(得分:1)

如果你今天需要答案......

我试图替换现有钥匙串项目的访问对象,但也没有成功。所以,我决定修改现有的访问对象而不是替换它,这种方法效果很好。

以下伪代码演示了这个想法。为清楚起见,剥离了声明,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过滤。

简单的访问对象创建必须更加棘手,您要创建与Keychain Access应用程序相同的ACL结构,而不是使用默认的SecAccessCreate()的ACL。我无法应付这种方式。