我有一个应用程序,它也配置并运行一个守护进程。我试图给守护进程和应用程序访问钥匙串项目的权限。基本代码:
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
遵守完整/绝对路径的任何想法吗?
答案 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。我无法应付这种方式。