2010-02-10 4 views
8

NSStream의 SSL 기능을 사용하는 응용 프로그램을 iphone에 작성하고 있습니다. SSL을 사용하여 서버를 직접 연결할 수 있기 때문에 SSL이 작동하고 있음을 알고 있습니다.
starttls를 사용하는 프로토콜에서 보안되지 않은 소켓에서 통신해야하고 starttls 명령을 보낸 다음 SSL에 대해 동일한 소켓을 다시 사용해야하는 문제가 발생했습니다. 내가 아는 한 nsstream 연결을 재사용 할 수 없으며 연결을 연 후 SSL을 시작할 수 없습니다.NSStream SSL 사용 소켓

내 소켓을 수동으로 작성한 다음 기존 소켓을 사용하여 NSstream을 설정하고 SSL을 시작하는 방법에 대해 생각했습니다. 그러나, 그것은 소켓에 의사 소통 내가 그것을 SSL 시작할 수없는 상태에 배치 나타납니다. nsstream에 소켓을 사용하려고하면 오류가 발생합니다.

의견이 있으십니까?

+0

는 setProperty는 전화 해봤 적절한 보안 상수 이미 열려있는 NSSocket에? 기본 SecureTransport 코드가 암호화되지 않은 초기 연결에서 TLS/SSL로 전환하는 것을 지원한다고 생각합니다. –

+0

그래서 이것을 알아 냈습니다. CFsocket을 사용하고 NSsockets를 사용하지 말고 문서에서 그렇게하지 않는다고 말하면 SSL을 적용해야합니다. 보안 연결을 올바르게 협상합니다. – anurodhp

+0

"NSsockets"와 같은 것이 없습니다 – user102008

답변

7

올바른 방법입니다. (소켓 연결 후 속성을 설정하는)이 문서화되지 않은 동안이 작업은 내 Monal xmpp 클라이언트에서 직접 작성한 코드이며 Apple에서 응용 프로그램 저장소에 어떤 문제도 부여하지 않았습니다. 연결이 열리고 당신이 NSStreamEventOpenCompleted을 얻고 startTLS에이 클라이언트에서 호스트로 전송되었습니다] 명령되면

NSInputStream *iStream; 
NSOutputStream *oStream; 


CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)server, port, &iStream, &oStream); 


[iStream open]; 
    [oStream open]; 

: forKey을 :

NSDictionary *settings = [ [NSDictionary alloc ] 
            initWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredCertificates", 
            [NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsExpiredRoots", 
            [NSNumber numberWithBool:YES], @"kCFStreamSSLAllowsAnyRoot", 
            [NSNumber numberWithBool:NO], @"kCFStreamSSLValidatesCertificateChain", 
            [NSNull null],@"kCFStreamSSLPeerName", 
            @"kCFStreamSocketSecurityLevelNegotiatedSSL", 
            @"kCFStreamSSLLevel", 
            nil ]; 
     CFReadStreamSetProperty((CFReadStreamRef)iStream, 
           @"kCFStreamPropertySSLSettings", (CFTypeRef)settings); 
     CFWriteStreamSetProperty((CFWriteStreamRef)oStream, 
           @"kCFStreamPropertySSLSettings", (CFTypeRef)settings); 
+2

문자열로 묶는 대신 상수를 사용하는 것이 좋습니다. 상수와 문자열은이 경우 동일한 결과로 평가 될 수 있지만 항상 그런 것은 아닙니다. 그래서, "kCFStreamSSLLevel"대신 kCFStreamSSLLevel. –

+0

iOS 7 앱에서 CFReadStreamSetProperty를 사용하려하지만 Xcode 5.1.1에서는 "CFReadStreamSetProperty '에 대한 호출에 대해 일치하는 함수가 없습니다. #import #import < CoreFoundation/CFStream.h> 그리고 CFNetwork.framework와 CoreFoundation.framework도 추가했습니다. –