我尝试在 FileVault 登录后访问钥匙串项目,但我无法执行此操作。我已经看到类似的问题出现在 从 OS X 授权插件访问钥匙串项目时出错,请帮助我解决这个已经很困难的问题一周后就这样了。
我遇到过类似的情况,似乎非特权授权插件无法访问“系统”钥匙串。所以我提前创建了一个新的钥匙串,其中包含身份验证插件所需的项目。
// blabla is pw for keychain and blabla2 is pw for p12 file.
security create-keychain -p balboa /tmp/my.keychain
security unlock-keychain -p balboa /tmp/my.keychain
sudo -A security import /tpm/mycert.p12 -k /tmp/my.keychain -P blabla2 -A
比,通过授权插件,我成功地访问了钥匙串内的项目。在下面的伪代码中,我演示了如何根据颁发者从钥匙串获取证书,但也允许任何其他方式访问钥匙串进行读取。
SecKeychainRef myKeychain = nil;
SecKeychainOpen( "/tmp/my.keychain", &myKeychain);
NSString * keychainPassword = @"blabla";
SecKeychainUnlock(myKeychain, [keychainPassword length], [keychainPassword UTF8String], true);
CFArrayRef keychainToSearchIdentity = CFArrayCreate(kCFAllocatorDefault, (const void **) &myKeychain, 1, &kCFTypeArrayCallBacks);
const void *keys[] = {kSecMatchSearchList, kSecClass, kSecReturnRef, kSecMatchIssuers};
const void *values[] = { keychainToSearchIdentity, kSecClassIdentity, kCFBooleanTrue, mySearchCriteriaIssuers };
CFDictionaryRef searchItemDict = CFDictionaryCreeate(NULL, keys, values, 4 ,NULL, NULL);
SecItemCopyMatch(searchItemDict, &myIdentity);
登录窗口仅提供系统钥匙串。因此,您可以使用带有 ACL 的系统钥匙串来启动守护进程或预登录代理。
登录窗口一出现,启动守护进程就会启动,以便访问任何值,将 XPC 消息从身份验证插件发送到守护进程,守护进程进程可以从系统钥匙串中获取值,并通过 XPC 将值发送回。
由于 Daemon 已添加到 ACL 中,因此其他进程无法访问该项目。