2012-11-23 5 views
6

HTTP 연결을 위해 CFStream/NSStream을 사용하고 있습니다.SSL 핸드 셰이크를 위해 CFStream (또는 NSStream)을 구성하는 방법은 무엇입니까?

  • 사례 A : : 서버가
  • 의 경우 B 신뢰할 수없는 : 은 내가 SSL 핸드 쉐이크 세 가지 경우에 실패하는 것을 감지 할 수 있도록하려면 서버를 신뢰할 수 있지만 클라이언트 인증서를
  • 경우 C를 요청합니다 : 서버가 신뢰되지 않고 내 CFStream의 SSL 속성에 anithing을하지 않고

오늘 클라이언트 인증서를 요청, 내가 얻을 :

  • 의 경우 A : 오류 -9807
  • 사례 B : 오류하지만 서버가 연결을 거부 (오류 500)
  • 의 경우 C : 오류 9807

올바르게 이러한 구별하기 CFStream을 구성 할 수있는 방법은 없습니다 3 건? 아니면 SSL 핸드 셰이크 중에 콜백을해야합니까?

도움 주셔서 감사합니다.

답변

4

얼마 전에 SSL을 사용하여 CFSockets와 동일한 문제가 발생했습니다. CFStream은 모든 악수를 처리합니다. 나는 NSStream을위한 약간의 클래스 추가를 썼다. (Base 코드는 Apple에서 왔고, 더 이상 링크가 없다. 그게 나를 위해 일한거야.

인터페이스

@interface NSStream (FSNetworkAdditions) 

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName 
              port:(NSInteger)port 
            inputStream:(out NSInputStream **)inputStreamPtr 
            outputStream:(out NSOutputStream **)outputStreamPtr; 

@end 

그리고 구현이 같은 서버에 연결할 수 없습니다 그것 뿐이다

#import "FSNetworkAdditions.h" 

@implementation NSStream (FSNetworkAdditions) 

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName 
              port:(NSInteger)port 
            inputStream:(out NSInputStream **)inputStreamPtr 
            outputStream:(out NSOutputStream **)outputStreamPtr 
{ 
    CFReadStreamRef  readStream; 
    CFWriteStreamRef writeStream; 

    assert(hostName != nil); 
    assert((port > 0) && (port < 65536)); 
    assert((inputStreamPtr != NULL) || (outputStreamPtr != NULL)); 

    readStream = NULL; 
    writeStream = NULL; 

    CFStreamCreatePairWithSocketToHost(
             NULL, 
             (CFStringRef) hostName, 
             port, 
             ((inputStreamPtr != NULL) ? &readStream : NULL), 
             ((outputStreamPtr != NULL) ? &writeStream : NULL) 
             ); 

    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys: 
           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates, 
           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
           [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots, 
           [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
           //kCFNull,kCFStreamSSLPeerName, 
           kCFStreamSocketSecurityLevelSSLv3, kCFStreamSSLLevel, 
           [NSNumber numberWithBool:YES], kCFStreamPropertyShouldCloseNativeSocket, 
           nil]; 

    if (readStream) { 
     CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 
    } 

    if (writeStream) { 
     CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 
    } 

    if (inputStreamPtr != NULL) { 
     *inputStreamPtr = CFBridgingRelease(readStream); 
    } 
    if (outputStreamPtr != NULL) { 
     *outputStreamPtr = CFBridgingRelease(writeStream); 
    } 


} 

@end 

: "자기"는 NSStreamDelegate 프로토콜을 준수

NSInputStream *inputStream; 
NSOutputStream *outputStream; 
[NSStream qNetworkAdditions_getStreamsToHostNamed:host 
              port:port 
             inputStream:&inputStream 
            outputStream:&outputStream]; 

     inputStream.delegate = self; 
     outputStream.delegate = self; 

.

이 스 니펫이 도움이 되었기를 바랍니다.

+1

다음은 Arndt가 언급 한 Apple 문서에 대한 링크입니다. https://developer.apple.com/library/ios/qa/qa1652/_index.html – Fletch

관련 문제