我正在尝试提取一个.p12文件,并将其用于针对我自己的服务器的双向身份验证。当我尝试编译时,出现一些链接错误。错误是指:

  • _kSecImportExportPassphrase
  • _SecIdentityCopyCertificate
  • _kSecImportItemTrust
  • _SecPKCS12导入
  • _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+中,转到“构建阶段”选项卡,“使用库链接二进制文件”,单击“+”并添加“Security.framework”。

    10-07 19:54
    查看更多