get pfx file included in a mobilecertificate in iOS

后端 未结 2 1274
无人及你
无人及你 2021-01-22 22:57

I\'m trying to connect to a server using a .pfx that is stored in a .mobileconfig file on my iPhone.

When the server ask for it in

-(void)connection:(NSU         


        
2条回答
  •  灰色年华
    2021-01-22 23:26

    U can use my code:

     - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge   
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"torbix" ofType:@"pfx"];
        NSData *pfxdata = [NSData dataWithContentsOfFile:path];
        CFDataRef inpfxdata = (CFDataRef)pfxdata;
        SecIdentityRef myIdentity;
        SecTrustRef myTrust;
        OSStatus status = extractIdentityAndTrust(inpfxdata, &myIdentity, &myTrust);
        SecCertificateRef myCertificate;
        SecIdentityCopyCertificate(myIdentity, &myCertificate);
        const void *certs[] = { myCertificate };
        CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL);
        NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity
                                                                 certificates:(NSArray *)myCertificate
                                                                  persistence:NSURLCredentialPersistencePermanent];
        [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
        CFRelease(myIdentity);
        CFRelease(myCertificate);
        CFRelease(certsArray);
    
    }
    //extractIdentityAndTrust method.
    -(OSStatus) extractIdentityAndTrust:(CFDataRef)inpfxdata identity:(SecIdentityRef *)identity trust:(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(inpfxdata, 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;
    }
    

    good luck!^-^

提交回复
热议问题