使用套接字上的NSStream SSL

时间:2010-02-10 15:04:09

标签: iphone sockets ssl nsstream

我正在编写一个在iphone上使用NSStream的SSL功能的应用程序。我知道SSL正在运行,因为我可以使用SSL直接连接服务器 我遇到过一个问题,即使用starttls的协议要求我使用不安全的套接字进行通信,发送starttls命令然后重复使用相同的套接字进行SSL。据我所知,nsstream连接无法重用,并且在打开连接后无法在它们上启动SSL。

我考虑创建自己的套接字,手动进行通信,然后使用现有套接字设置NSstream并以这种方式启动SSL。但是,看起来套接字上的通信将其置于我无法在其上启动SSL的状态。任何尝试将套接字用于nsstream都会导致错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

这是执行此操作的正确方法。这样做(在套接字连接后设置属性)没有记录,这是我的Monal xmpp客户端的代码,苹果从来没有在应用程序商店给我任何问题。

 NSInputStream *iStream;
NSOutputStream *oStream;


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


[iStream open];
    [oStream open];

连接打开后,您将获得NSStreamEventOpenCompleted,并且startTLS命令已从客户端发送到主机:

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