NsurlcredentialStentyStorage и аутентификация сертификата клиента
-
09-10-2019 - |
Вопрос
Из того, что я вижу в документации MPMoviewPlaeercontroller, NSurlcredentialentStorage можно настроить в качестве альтернативы проблем аутентификации NSURLConnection (это полезно для классов более высокого уровня, которые загружают ресурсы от URL-адресов, но абстрактные NSURLConnection вдали и не предоставляют делегат для обработки аутентификации Проблемы). Это похоже на установку сертификата в браузере и автоматически выберите необходимый сертификат, когда определенный адрес требует его.
Чтобы проверить это, я настроил свой собственный орган сертификата, сертификата сервера и клиентский сертификат (файл .p12). Я настроил сервер HTTPS и успешно протестировал клиентский сертификат с помощью браузера с отдельного компьютера.
Теперь мне нужно, чтобы сертификат встроен в мое приложение для iPhone.
Я включил файл 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];
Функция AddiciveDientityAndTrust просто копируется сформирована задачам служб сертификата, ключа и доверительных услуг для страницы документации IOS (я только что заменил пароль сертификата с моим собственным).
Из того, что я могу сказать, идентичности и сертификат загружены хорошо. Если я распечатаю nsurlcredential объект в консоли, я получаю что-то подобное: <NSURLCredential: 0x140ea0>: (null)
(Я не могу сказать, является ли это хорошим знаком или нет).
Однако, когда я выполняю SetDefaultCredential, приложение вылетает, не давая много информации.
Stacktrace выглядит что-то подобное:
#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, открыв файл из почты. Я могу получить доступ к страницам через HTTPS через Safari, но не через мое приложение.
Единственное, что работает, это если я открою NSURLConnection к любому ресурсу о защищенном домене, отвечаю на дидречеобразноеeateenticateChallenge (где я загружаю свои учетные данные точно так же, как в коде выше, только я отправляю его непосредственно на отправителя NSURLAUTHENTICYCHALLENGE), а затем получить доступ к веду Мне действительно нужно использовать класс более высокого уровня.
Решение
Похоже, это известная проблема, которую NSURLCREDINGENT ALDIC работает только для имени пользователя и пароля NSURLcredentials (сертификаты не поддерживаются). К сожалению, документация ничего не упоминает об этом.