当我尝试使用MacOSX10.6提供的安全框架中的SecPKCS12Import()时,结果代码总是errSecUnimplemented,而不管提供什么参数。
此外,链接器无法为SecImportExport.h (即kSecImportExportPassphrase、kSecImportItemIdentity等)中声明的与此函数相关的常量找到符号。
这个库到底是怎么回事--这个函数是实现了还是没有实现?为什么链接器可以解析框架中的所有其他符号,而不能解析这些符号呢?如何将PKCS12 12格式的二进制blob转换为SecIdentityRef或SecCertificateRef和SecKeyRef对?
我做错了什么?我肯定这是PEBKAC的问题。:-)
编辑:我发现我的问题很不清楚。我知道Security.framework是实现的,因为我能够使用它提供的其他功能,而不存在任何问题。考虑到这一点,我相当肯定我是根据框架正确链接的,因为如果我删除链接,就找不到任何符号--就像预期的那样。当我重新链接框架时,所有的符号都会被找到,除了与SecPKCS12Import()相关的常量,例如kSecImportExportPassphrase、kSecImportItemIdentity等等。
考虑到我不能使用这些符号,我传入了可能是不正确的字符串(@"kSecImportItemIdentity"等),但是返回的错误代码是errSecUnimplemented。这使我相信,也许这个特定的功能还没有实现。
我试过使用10.5SDK,但这当然不起作用。:-)
编辑:我的导入只是一个普通的#import <Security/Security.h>。对于踢腿,我也尝试了#import <Security/SecImportExport.h>,但这并没有改变。也就是说,错误是由链接器发出的,而不是编译器发出的。
我运行dyldinfo -export Security.framework/Security列出了由库导出的符号,并找到了许多新的符号,但是kSecImportExportPassphrase和朋友明显地失踪了。这可能解释了为什么链接器找不到符号。SecPKCS12Import的符号出现在符号表中,我可以说它没有问题,只是功能似乎不存在。
发布于 2009-11-23 04:19:00
Security.framework是最有可能实现的--参见安全参考更新,它记录了框架在10.6和更早版本中更改的内容。因为您知道要使用的头,所以我想您已经咨询过安全框架参考了。
您确定您正在根据框架正确地导入和链接吗?(它在/System/Library/Security.framework中,所以您不应该指定路径。)
编译器是否发出警告或错误,说明SecImportExport.h中的符号未定义?(如果不是,你怎么知道它们是“声明但未定义的”?)
当你说这在10.6上失败时,你在早期版本的操作系统上成功地尝试过吗?
编辑:好吧,既然您正在成功地使用Security.framework的其他部分,而且您试图使用的API和常量仅为10.6,这看起来并不像是链接问题。你们的进口是什么样子的?您确定您正在正确导入SecImportExport.h吗?常量声明在SecPKCS12Import()函数的上方,因此,如果收到对常量的警告,也应该得到未定义函数的警告。
编辑:我已经与在Security.framework上工作的苹果团队的一名成员确认,该功能目前还没有实现。请在http://bugreport.apple.com上针对组件Security (New Bugs),版本X,提交一个bug来抱怨这一点。在您的报告中包含此问题的URL。对不起,现在没有更好的答案了。
发布于 2009-11-23 09:14:44
据我所知,苹果擅长于部分实现或不留下任何文档。如果您真的找不到真正需要的实现,可以使用OpenSSL提取blobs,然后使用Security将它们导入到密钥链或使用Security/CDSA方法进一步处理。如果你有可能的话,你可以用更多的问题来连接Apple dev。
此外,查看我的10.6.2机器上的/System/Library/Frameworks/Security.framework/Headers/SecImportExport.h,我在SecKeychainItemImport()的文档中看到了对PKCS#12的引用。
搜索该文件中的"PKCS12“以获得更多信息。
https://stackoverflow.com/questions/1780884
复制相似问题