2013-08-20 2 views
3

Я запускаю сервер Java, который принимает соединения Socket или SSLSocket (разные порты). На стороне клиента я использую в своем приложении iPhone GCDAsyncSocket для подключения к серверу. Что отлично работает, если я использую небезопасную версию (без SSL).GCDAsyncSocket с SSL

Теперь я пытаюсь подключиться с использованием SSL. Как это сделать? Я не знаю, с чего начать. Мои вопросы:

1) Какие сертификаты мне нужны? Приложение Android работает отлично с тем же сервером, используя сертификат .bks

2) Как импортировать сертификат в мое приложение? Я хочу, чтобы он позже распространялся через AppStore. Нужно ли размещать файлы сертификатов внутри какого-либо каталога приложения?

3) Где загрузить сертификаты в коде? Есть метод, похожий на - (void) loadCertificate { NSString * myCertificate = @ "client.bks"; ... }

4) Какие параметры я должен установить, чтобы активировать SSL в GCDAsyncSocket, как -л BOOL UseSSL = TRUE; ...

5) При условии ответа на вопросы 1-4. Что теперь? Как инициировать подключение к серверу? Какой конструктор, с какими параметрами использовать?

В случае, если кто-то спрашивает «зачем использовать SSLSocket, а не ...». Поскольку сервер уже существует, и он очень хорошо работает с Android-приложением.

Благодарим за помощь!

ответ

6

Это старый вопрос, но я надеюсь, что это поможет кому-то еще.

  1. Я предпочитаю pfx, но я думаю, что bks тоже будет хорошо.
  2. Да, вам нужно поставить эти сертификаты в комплект.
  3. Вам необходимо установить настройки SSL в методе didConnectToHost.
  4. [sock startTLS: sslSettings];

И, наконец, есть пример приложения в папке CocoaAsyncSocket под названием ConnectTest, сначала вы должны проверить it.

NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init]; 
     NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"bks"]]; 
     CFDataRef inPKCS12Data = (CFDataRef)CFBridgingRetain(pkcs12data); 
     CFStringRef password = CFSTR("YOUR 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); 

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

     SecIdentityRef certArray[1] = { myIdent }; 
     CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL); 

     [sslSettings setObject:(id)CFBridgingRelease(myCerts) forKey:(NSString *)kCFStreamSSLCertificates]; 
     [sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel]; 
     [sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; 
     [sslSettings setObject:@"CONNECTION ADDRESS" forKey:(NSString *)kCFStreamSSLPeerName]; 
     [sock startTLS:sslSettings]; 
Смежные вопросы