Я полагаю, используя сертификат .p12, вы имеете в виду установление взаимной аутентификации между клиентом и сервером.По сути, вы должны выполнить следующие шаги (target-c):
- Создать объекты безопасности, необходимые для аутентификации сервера (проверить его подпись на основе сигнатуры корневого CA) и аутентифицировать клиента (предоставитьсертификат клиента на сервер для проверки его подписи).Загрузите файл .cer CA и файл .p12 клиента.
- Определите ресурс URL, который вы хотите получить, и создайте NSURLConnection
- Укажите методы аутентификации, которые вы хотите обработать (используяОбратные вызовы NSURLConnectionDelegate)
- Обработка запроса аутентификации (с использованием обратных вызовов NSURLConnectionDelegate)
Загрузка файлов сертификата (корневой сертификат CA сервера + ключ и сертификат клиента)
rootCertRef содержит сертификат CA (корневой сертификат CA, подписавшего сертификат сервера)
identity (SecIdentityRef) содержит ключ клиента и сертификат, необходимые для аутентификации клиента на сервере.
NSData *rootCertData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@”rootCert” ofType:@”cer”]];
SecCertificateRef rootCertRef = SecCertificateCreateWithData(kCFAllocatorDefault, (CFDataRef) rootCertData);
NSData *p12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@“clientCert" ofType:@"p12"]];
NSArray *item = nil;
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@“password", kSecImportExportPassphrase, nil];
SecPKCS12Import((CFDataRef) p12Data , (CFDictionaryRef)dict, (CFArrayRef *)item);
SecIdentityRef identity = (SecIdentityRef)[[item objectAtIndex:0] objectForKey:(id)kSecImportItemIdentity];
Настройка URL (вы уже это сделали)
// Create the request.
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
Создать NSURLConnection >> установить для делегата self, который должен реализовывать NSURLConnectionDelegate значениебыть в состоянии выполнить аутентификацию клиента
// Create url connection and fire request asynchronously
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
Включить аутентификацию сервера и клиента в калlback canAuthenticateAgainstProtectionSpace
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust])
return YES;
if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodClientCertificate])
return YES;
return NO;
}
Выполните взаимную аутентификацию, запрошенную сервером
-(void) connection:didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
//Authenticate the server
if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { // Verify method
SecTrustRef trust = [[challenge protectionSpace] serverTrust]; // Create trust object
NSArray *trustArray = [NSArray arrayWithObjects:rootCertRef, nil]; // Add as many certificates as needed
SecTrustSetAnchorCertificates(trust, (CFArrayRef) trustArray ); // Set trust anchors
SecTrustResultType trustResult; // Store trust result in this
SecTrustEvaluate(trust, trustResult); // Evaluate server trust
if(trust_result == kSecTrustResultUnspecified) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
} else {
// handle error;
}
//Send client identity to server for client authentication
if([[challenge protectionSpace] authenticationMethod] isEqualToString:NSURLAuthenticationMethodClientCertificate]) {
NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:nil persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
}