我正在尝试提取.p12文件并将其用于针对我自己的服务器的双向身份验证.当我正在尝试编译时,我得到一些链接错误.错误是指:
_kSecImportExportPassphrase
_SecIdentityCopyCertificate
_kSecImportItemTrust
_SecPKCS12Import
_kSecImportItemIdentity
这是我用来提取p12文件的代码:
-(void)clientCert { NSString *path = [[NSBundle mainBundle] pathForResource:@"torbix" ofType:@"p12"]; NSData *p12data = [NSData dataWithContentsOfFile:path]; CFDataRef inP12data = (CFDataRef)p12data; SecIdentityRef myIdentity; SecTrustRef myTrust; OSStatus status = extractIdentityAndTrust(inP12data, &myIdentity, &myTrust); SecCertificateRef myCertificate; SecIdentityCopyCertificate(myIdentity, &myCertificate); const void *certs[] = { myCertificate }; CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL); } OSStatus extractIdentityAndTrust(CFDataRef inP12data, SecIdentityRef *identity, SecTrustRef *trust) { OSStatus securityError = errSecSuccess; CFStringRef password = CFSTR("password"); const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { password }; CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); securityError = SecPKCS12Import(inP12data, options, &items); if (securityError == 0) { CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0); const void *tempIdentity = NULL; tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity); *identity = (SecIdentityRef)tempIdentity; const void *tempTrust = NULL; tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust); *trust = (SecTrustRef)tempTrust; } if (options) { CFRelease(options); } return securityError; }
为什么我会收到这些错误?
添加Security.framework
到您的项目.
在目标的Xcode 4.2+中,转到"Build Phases"选项卡,"Link BinariesWith Libraries",单击"+"并添加"Security.framework".