Xcode SecTrustedApplicationCreateFromPath是否太聪明?

Xcode SecTrustedApplicationCreateFromPath是否太聪明?,xcode,keychain,Xcode,Keychain,我有一个应用程序,它也可以配置和运行守护进程。我试图同时授予守护进程和应用程序对keychain项的访问权限。基本守则: SecKeychainItemRef item; // create a generic password item SecTrustedApplicationRef appRef[2]; SecAccessRef ref; SecTrustedApplicationCreateFromPath( NULL, &appRef[0] ); SecTrustedApplicati

我有一个应用程序,它也可以配置和运行守护进程。我试图同时授予守护进程和应用程序对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 ); SecKeychainItemRef项; //创建通用密码项 SecTrustedApplicationRef appRef[2]; SecAccessRef; SecTrustedApplicationCreateFromPath(NULL,&appRef[0]); SecTrustedApplicationCreateFromPath(守护进程路径和appRef[1]); CFArrayRef trustList=CFArrayCreate(NULL,(void*)appRef,sizeof(appRef)/sizeof(*appRef),NULL); SecAccessCreate(描述符、信任列表和引用); SecKeychainItemSetAccess(项目,参考); 创建钥匙链条目,但是钥匙链访问工具中列出的唯一始终具有访问权限的应用程序是主应用程序。让我们称之为FOO.appDAEMON_PATH指向应用程序包中的守护程序的绝对路径——称之为
FOO.DAEMON

如果我手动进入Keychain访问并选择守护进程,它确实会添加到列表中


您知道如何获得
SecTrustedApplicationCreateFromPath
以尊重完整/绝对路径吗?

如果您今天需要答案

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

下面的伪代码演示了这个想法。为了清晰起见,声明、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);
我使用
secaccesscopyselectedaclist
搜索具有适当授权标记的ACL对象。您可能需要其他方式进行ACL筛选


简单的访问对象创建必须更加复杂,您需要创建与Keychain access应用程序相同的ACL结构,而不是使用默认的
SecAccessCreate()
的ACL。我不能那样应付。

如果你今天需要答案

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

下面的伪代码演示了这个想法。为了清晰起见,声明、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);
我使用
secaccesscopyselectedaclist
搜索具有适当授权标记的ACL对象。您可能需要其他方式进行ACL筛选


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

我目前面临着类似的问题。我使用了这个解决方案,应用程序可执行文件被添加到ACL中,但是,如果不提示用户,我以后无法访问该对象。你解决这个问题了吗?我的问题:@stkuzma for me
SecKeychainItemCopyAccess
API失败,错误为-25243(指定的项没有访问控制)。我想每个
KeychainItem
都有访问控制。知道这里可能会出什么问题吗?@MichałSiwek甚至
SecKeychainItemSetAccess
给了我-25243的错误。有什么输入吗?@stkuzma你是想修改系统keychain中keychain的ACL还是登录keychain中的ACL?我目前面临着类似的问题。我使用了这个解决方案,应用程序可执行文件被添加到ACL中,但是,如果不提示用户,我以后无法访问该对象。你解决这个问题了吗?我的问题:@stkuzma for me
SecKeychainItemCopyAccess
API失败,错误为-25243(指定的项没有访问控制)。我想每个
KeychainItem
都有访问控制。知道这里可能会出什么问题吗?@MichałSiwek甚至
SecKeychainItemSetAccess
给了我-25243的错误。有任何输入吗?@stkuzma您是否试图在系统keychain或登录keychain中修改keychain的ACL?