2010-02-10 27 views
8

Tôi đang viết một ứng dụng sử dụng chức năng SSL của NSStream trên iphone. Tôi biết rằng SSL đang hoạt động vì tôi có thể kết nối trực tiếp máy chủ bằng SSL.
Tôi đã gặp phải sự cố trong đó các giao thức sử dụng starttls yêu cầu tôi giao tiếp trên ổ cắm không an toàn, hãy gửi lệnh starttls và sau đó sử dụng lại cùng một socket cho SSL. Theo như tôi biết kết nối nsstream không thể được tái sử dụng và tôi không thể bắt đầu SSL trên chúng sau khi tôi đã mở kết nối.SSL NSStream trên ổ cắm đã sử dụng

Tôi đã nghĩ đến việc tạo ổ cắm của riêng mình, giao tiếp theo cách thủ công và sau đó thiết lập NSstream bằng ổ cắm hiện có và khởi động SSL theo cách đó. Tuy nhiên, nó xuất hiện các giao tiếp trên socket đặt nó trong một trạng thái mà tôi không thể bắt đầu SSL trên đó. Bất kỳ nỗ lực nào để sử dụng socket cho kết quả nsstream đều bị lỗi.

Mọi suy nghĩ?

+0

Các bạn đã thử gọi setProperty: forKey: với các hằng số bảo mật thích hợp trên một NSSocket đã mở? Tôi tin rằng mã SecureTransport bên dưới hỗ trợ chuyển đổi sang TLS/SSL từ một kết nối ban đầu không được mã hóa. –

+0

Vì vậy, tôi đã tìm ra điều này. Bạn nên sử dụng CFsockets và không NSsockets và sau đó áp dụng SSL SAU kết nối ngay cả khi tài liệu nói rằng bạn không thể làm điều đó, nó sẽ chính xác thương lượng một kết nối an toàn. – anurodhp

+0

không có điều gì giống như "NSsockets" – user102008

Trả lời

7

Đây là cách chính xác để thực hiện việc này. trong khi thực hiện việc này (thiết lập thuộc tính sau khi kết nối socket) là không có giấy tờ, đây là mã trực tiếp từ trình khách Monm xmpp của tôi và quả táo chưa bao giờ cho tôi bất kỳ vấn đề nào trong kho ứng dụng.

NSInputStream *iStream; 
NSOutputStream *oStream; 


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


[iStream open]; 
    [oStream open]; 

Khi kết nối đã được mở ra và bạn sẽ có được NSStreamEventOpenCompleted và STARTTLS lệnh đã được gửi đến các máy chủ từ khách hàng:

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

Có lẽ nên sử dụng các hằng số thay vì gói chúng thành chuỗi; các hằng số và chuỗi có thể đánh giá kết quả tương tự trong trường hợp này nhưng không phải lúc nào cũng vậy. Vì vậy, kCFStreamSSLLevel thay vì @ "kCFStreamSSLLevel". –

+0

Tôi đang cố gắng sử dụng CFReadStreamSetProperty trong ứng dụng iOS 7 của mình, nhưng Xcode 5.1.1 nói với mit "Không có hàm nào phù hợp để gọi đến 'CFReadStreamSetProperty' mặc dù tôi có #import #import < CoreFoundation/CFStream.h> và tôi cũng đã thêm CFNetwork.framework và CoreFoundation.framework. Bất kỳ lần truy cập nào để khắc phục điều đó? –

Các vấn đề liên quan