2013-08-20 2 views
3

소켓 또는 SSLSocket 연결 (다른 포트)을 허용하는 Java 서버를 실행합니다. 클라이언트 측에서는 iPhone 앱에서 GCDAsyncSocket을 사용하여 서버에 연결합니다. 안전하지 않은 버전 (SSL 없음)을 사용하면 잘 작동합니다.SSL이 포함 된 GCDAsyncSocket

이제 SSL을 사용하여 연결을 시도합니다. 이 작업을 수행하는 방법? 나는 어디에서 시작해야할지 전혀 모른다. 내 질문 :

1) 어떤 종류의 인증서가 필요합니까? Android 앱은 .bks 인증서를 사용하여 동일한 서버에서 올바르게 작동합니다.

2) 내 앱에 인증서를 어떻게 가져 오나요? 나중에 AppStore를 통해 배포하고 싶습니다. 응용 프로그램의 일부 디렉토리에 인증서 파일을 저장해야합니까?

3) 코드에서 인증서를 어디에서로드합니까? 메서드가 있나요? - (void) loadCertificate { NSString * myCertificate = @ "client.bks"; 매개 변수 내가 GCDAsyncSocket에서 SSL을 활성화하기 위해 설정해야 할 ... }

4), BOOL useSSL = 사실처럼 매끄러운; ...

5) 질문 1 - 4에 대답한다고 가정합니다. 지금 뭐야? 서버 연결을 시작하는 방법? 어떤 파라미터를 사용할 생성자?

"SSLSocket을 사용하는 이유는 무엇입니까?"라는 질문을하는 경우가 있습니다. 서버가 이미 존재하기 때문에 안드로이드 애플 리케이션과 잘 작동합니다.

도움 주셔서 감사합니다.

답변

6

이것은 오래된 질문이지만 다른 사람들에게 도움이되기를 바랍니다.

  1. 나는 pfx를 선호하지만 bks도 괜찮을 것이라고 생각합니다.
  2. 예, 해당 인증서를 번들로 묶어야합니다.
  3. didConnectToHost 메서드에서 SSL 설정을 지정해야합니다.
  4. [sock startTLS : sslSettings];

마지막으로 ConnectTest라는 CocoaAsyncSocket 폴더에 샘플 응용 프로그램이 있으므로 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];