Как программно импортировать сертификат в цепочку ключей моего приложения iOS и при необходимости передать удостоверение на сервер?

Я работаю над приложением iOS5, которое облегчит мобильные платежи между двумя пользователями. В рамках процесса оплаты отправитель и получатель должны взаимодействовать с сервером. Сервер требует, чтобы обе стороны представили свои удостоверения, когда при подключении инициируется запрос аутентификации.

В настоящее время я жестко -закодировал процесс сертификата, используя в своем коде следующие два метода:

Делегат NSURLConnection didReceiveAuthenticationChallenge

(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:    (NSURLAuthenticationChallenge *)challenge
{
NSLog(@"Authentication challenge");

// Load Certificate
NSString *path = [[NSBundle mainBundle] pathForResource:@"PKCS12" ofType:@"p12"];
NSData *p12data = [NSData dataWithContentsOfFile:path];
CFDataRef inP12data = (__bridge CFDataRef)p12data;

SecIdentityRef myIdentity;
SecTrustRef myTrust;
extractIdentityAndTrust(inP12data, &myIdentity, &myTrust);

SecCertificateRef myCertificate;
SecIdentityCopyCertificate(myIdentity, &myCertificate);
const void *certs[] = { myCertificate };
CFArrayRef certsArray = CFArrayCreate(NULL, certs, 1, NULL);

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:myIdentity certificates:(__bridge NSArray*)certsArray persistence:NSURLCredentialPersistencePermanent];

[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

Метод C ExtractIdentityAndTrust

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;
}

Я тестировал этот код много раз и был успешным. Теперь я пытаюсь двигаться дальше и разрешить сохранение соответствующего идентификатора, а затем извлекать его из цепочки для ключей приложения. Моя цель — позволить пользователям импортировать свои файлы P12 через общий доступ к файлам iTunes или Dropbox и сохранять их в цепочке для ключей.

Я просмотрел документацию Apple для Получение и использование постоянных ссылок на связку ключей и не смог понять, как импортировать удостоверение.Их код немного сбивает меня с толку, поскольку они используют необъявленные переменные/ссылки (, в частности

&persistent_ref

переменная ). Если кто поможет расшифровать, буду очень признателен.

TL;DR:Как сохранить содержимое файла P12 в связке ключей моего приложения iOS5 и получить его позже, чтобы передать его методу didReceiveAuthenticationChallenge NSURLConnection?

15
задан Cœur 11 October 2017 в 03:02
поделиться