NSURLCredentialStorage и аутентификация сертификата клиента - PullRequest
1 голос
/ 12 ноября 2010

Из того, что я вижу в документации MPMoviewPlayerController, NSURLCredentialStorage можно настроить как альтернативу задач аутентификации NSURLConnection (это полезно для классов более высокого уровня, которые загружают ресурсы из URL-адресов, но абстрагируют NSURLConnection и не предоставляют делегата).для обработки проблем аутентификации).Это похоже на установку сертификата в браузере и автоматический выбор требуемого сертификата, когда этого требует определенный адрес.

Чтобы проверить это, я настроил свой собственный центр сертификации, сертификат сервера и сертификат клиента (файл .p12).Я настроил https-сервер и успешно протестировал сертификат клиента с помощью браузера на отдельной машине.

Теперь мне нужно интегрировать сертификат в мое приложение для iPhone.

I 'я упаковал файл p12 и при запуске приложения я делаю это:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"clientside" ofType:@"p12"];
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;    
SecIdentityRef identity;
SecTrustRef trust;
extractIdentityAndTrust(inPKCS12Data, &identity, &trust);

SecCertificateRef certificate = NULL;
SecIdentityCopyCertificate (identity, &certificate); 

const void *certs[] = {certificate};
CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:(NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                         initWithHost: @"myhostname"
                                         port: 443
                                         protocol: @"https"
                                         realm: nil
                                         authenticationMethod: NSURLAuthenticationMethodClientCertificate];

[[NSURLCredentialStorage sharedCredentialStorage]
 setDefaultCredential: credential
 forProtectionSpace: protectionSpace];

Функция extractIdentityAndTrust просто копируется со страницы документации «Задачи служб сертификации, ключей и доверия для iOS» (я только что заменилпароль сертификата с моим собственным).

Из того, что я могу сказать, удостоверение личности и сертификат загружаются красиво.Если я печатаю объект NSURLCredential в консоли, я получаю что-то вроде этого: <NSURLCredential: 0x140ea0>: (null) (я не могу сказать, является ли это хорошим знаком или нет).

Однако, когда я выполняю setDefaultCredential, приложение вылетает без предоставлениямного информации.

Трассировка стека выглядит примерно так:

#0  0x350a41c8 in CFHash
#1  0x3515180c in __CFBasicHashStandardHashKey
#2  0x351534e4 in ___CFBasicHashFindBucket_Linear
#3  0x350a4000 in CFBasicHashFindBucket
#4  0x350a3ecc in CFDictionaryGetValue
#5  0x344a0df2 in URLCredentialStorage::setDefaultCredentialForProtectionSpace
#6  0x3446a5aa in CFURLCredentialStorageSetDefaultCredentialForProtectionSpace
#7  0x339ec79e in -[NSURLCredentialStorage setDefaultCredential:forProtectionSpace:]
#8  0x00002612 in -[AVPlayerExampleViewController awakeFromNib] at AVPlayerExampleViewController.m:84

Мне кажется, что что-то не задано в учетных данных.

Есть идеи о том, как решитьэто?

РЕДАКТИРОВАТЬ:

Просто для тестирования я установил сертификат на iPhone, открыв файл из Mail.Я могу получить доступ к страницам через https через Safari, но не через мое приложение.

Единственное, что работает, это то, что если я открываю NSURLConnection к любому ресурсу в защищенном домене, отвечаю на didReceiveAuthenticationChallenge (где я загружаю свойучетные данные в точности как в коде выше, только я отправляю их непосредственно отправителю NSURLAuthenticationChallenge) и затем получаю доступ к вещам, которые мне действительно нужны, используя класс более высокого уровня.

1 Ответ

4 голосов
/ 15 ноября 2010

Кажется, это известная проблема, что NSURLCredentialStorage работает только для имени пользователя и пароля NSURLCredentials (сертификаты не поддерживаются). К сожалению, в документации ничего не говорится об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...