GCDAsyncSocket с аутентификацией клиента

Я использую CocoaAsyncSocket для отправки данных на наш сервер без SSL. Теперь серверная сторона реализовала SSL / TLS с аутентификацией клиента. Чтобы реализовать это в нашем приложении, мне были предоставлены следующие три файла:

  1. ча-chain.cert.pem
  2. клиент-test.cert.pem
  3. клиент-test.key.pem

Я преобразовал файлы в читаемые форматы iOS, как показано ниже:

  1. ca-chain.cert.pem для ca-cert.cer
  2. client-test.cert.pem для client_cert.cer
  3. client-test.key.pem – client_key.p12

У меня это работает до SSL. Но возникают проблемы с аутентификацией клиента.

Вот мой код:

didConnectToHost:

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port; { // Configure SSL/TLS settings NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3]; // Allow self-signed certificates CFArrayRef certsArray = [self loadCertificates]; [settings setObject:@0 forKey:GCDAsyncSocketSSLProtocolVersionMax]; [settings setObject:[NSNumber numberWithBool:YES] forKey:GCDAsyncSocketManuallyEvaluateTrust]; [settings setObject:(id)CFBridgingRelease(certsArray) forKey:GCDAsyncSocketSSLCertificates]; [sock startTLS:settings]; } 

didReceiveTrust:

 - (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler { NSString *caCertPath = [[NSBundle mainBundle] pathForResource:@"ca-cert" ofType:@"cer"]; NSData *caCertData = [NSData dataWithContentsOfFile:caCertPath]; NSString *clientCertPath = [[NSBundle mainBundle] pathForResource:@"client_cert" ofType:@"cer"]; NSData *clientCertData = [NSData dataWithContentsOfFile:clientCertPath]; OSStatus status = -1; SecTrustResultType result = kSecTrustResultDeny; if(caCertData && clientCertData) { SecCertificateRef cert1; cert1 = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) caCertData); SecCertificateRef cert2; cert2 = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) clientCertData); const void *ref[] = {cert1,cert2}; CFArrayRef ary = CFArrayCreate(NULL, ref, 2, NULL); SecTrustSetAnchorCertificates(trust, ary); status = SecTrustEvaluate(trust, &result); } else { NSLog(@"local certificates could not be loaded"); completionHandler(NO); } if ((status == noErr && (result == kSecTrustResultProceed || result == kSecTrustResultUnspecified))) { completionHandler(YES); } else { CFArrayRef arrayRefTrust = SecTrustCopyProperties(trust); NSLog(@"error in connection occured\n%@", arrayRefTrust); completionHandler(NO); } } 

loadCertificates:

 -(CFArrayRef) loadCertificates { NSString *clientKeyPath = [[NSBundle mainBundle] pathForResource:@"client_key" ofType:@"p12"]; NSData* clientKeyData = [NSData dataWithContentsOfFile:clientKeyPath]; NSLog(@"key : %@",[[NSString alloc] initWithData:clientKeyData encoding:NSASCIIStringEncoding]); CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(clientKeyData); CFStringRef password = CFSTR("_mypassword_"); const void *keys[] = { kSecImportExportPassphrase }; const void *values[] = { password }; CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); OSStatus securityError = SecPKCS12Import(inPKCS12Data, options, &items); CFRelease(options); CFRelease(password); if(securityError == errSecSuccess) NSLog(@"Success opening p12 certificate."); CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); SecIdentityRef myIdent = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity); NSString *clientCertPath = [[NSBundle mainBundle] pathForResource:@"client_cert" ofType:@"cer"]; NSData *clientCertData = [NSData dataWithContentsOfFile:clientCertPath]; SecCertificateRef clientCert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) clientCertData); //SecIdentityRef certArray[1] = { myIdent }; const void *ref[] = {myIdent, clientCert}; CFArrayRef myCerts = CFArrayCreate(NULL, ref, 2, NULL); // NSString *caCertPath = [[NSBundle mainBundle] pathForResource:@"ca-cert" ofType:@"cer"]; // NSData *caCertData = [NSData dataWithContentsOfFile:caCertPath]; // // SecCertificateRef caCert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) caCertData); // // const void *ref[] = {clientCert, myIdent, caCert}; // CFArrayRef myCerts = CFArrayCreate(NULL, ref, 3, NULL); return myCerts; } 

Я уже два дня борюсь с аутентификацией клиента. Я получаю эту ошибку:

 2017-03-13 15:35:40.777 MPS[79612:1478858] GCDAsyncSocket socketDidDisconnect Error - Error Domain=kCFStreamErrorDomainSSL Code=-9806 "(null)" UserInfo={NSLocalizedRecoverySuggestion=Error code definition can be found in Apple's SecureTransport.h} 

Я прочитал, что у библиотеки CocoaAyncSocket возникает проблема с аутентификацией клиента с проверкой доверия вручную. Я пробовал обходное решение, как упоминалось здесь: Поддержка аутентификации на стороне клиента с ручным доверием. Оценка еще не удалась. Я не мог найти то, что мне не хватает.

Заранее спасибо! -Uma

One Solution collect form web for “GCDAsyncSocket с аутентификацией клиента”

Все хорошо с кодом. Надеюсь, это поможет кому-то найти ответ. Однако проблема заключалась в преобразовании файлов. Когда я использовал конвертированные файлы у другого человека, он работал.

Interesting Posts

Непризнанный селектор, отправленный экземпляру с использованием раскадровки

iOS 8.3 Mobile Safari отключает отображение эмозинга

Цель C – Ошибка объявления – пожалуйста, объясните

Xcode 9.0 iOS11 закрутил правый UIBarButtonItem

Положение касания iOS8 ограничено в ландшафте, как если бы окно было портным с одной стороны?

Невозможно определить, работает ли приложение Xamarin Forms в симуляторе или на устройстве

представление модального взгляда с быстрым

Невозможно установить имитатор ios 9 через xcode 7.3.1

Как использовать modalPresentationCapturesStatusBarAppearance = НЕТ с пользовательским UIPresentationController?

Процессы зомби с iPhone Simulator?

Как показать uidatepicker из uitableviewcell

UIBarButtonItem Пользовательский вид в UINavigationBar

Скопировать папку из основного пакета в каталог документов в iphone

Могу ли я установить «магазин приложений» в симуляторе IOS?

Друзья онлайн присутствия – Facebook SDK 3

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.