Iphone 已用套接字上的NSStream SSL

Iphone 已用套接字上的NSStream SSL,iphone,sockets,ssl,nsstream,Iphone,Sockets,Ssl,Nsstream,我正在编写一个在iphone上使用NSStream的SSL功能的应用程序。我知道SSL正在工作,因为我可以使用SSL直接连接服务器。 我遇到了一个问题,使用starttls的协议要求我在套接字上与不安全的套接字通信,发送starttls命令,然后将同一套接字重新用于SSL。据我所知,nsstream连接无法重用,并且在打开连接后,我无法在它们上启动SSL 我考虑创建自己的套接字,手动在其上进行通信,然后使用现有套接字设置NSstream并以此方式启动SSL。但是,套接字上的通信似乎使其处于无法启

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

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


有什么想法吗?

这是正确的方法。虽然这样做(在套接字连接后设置属性)没有文档记录,但这是直接来自我的Monal xmpp客户端的代码,苹果在应用商店中从未给过我任何问题

 NSInputStream *iStream;
NSOutputStream *oStream;


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


[iStream open];
    [oStream open];
打开连接并完成NSSTREATEVENTOPENCONCOMPLETED且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);

您是否尝试在已打开的NSSocket上使用适当的安全常量调用setProperty:forKey:?我相信底层的SecureTransport代码支持从未加密的初始连接切换到TLS/SSL。您应该使用CFsockets而不是NSsockets,然后在连接后应用SSL,即使文档中说您不能这样做,它也会正确协商安全连接。没有“NSsockets”之类的东西。请将您的解决方案添加为答案,并将其标记为答案。这会把未回答的问题列表弄得乱七八糟,而且你也得不到可以使用的代表分数。使用常量而不是将它们包装成字符串可能是一个更好的主意;在这种情况下,常量和字符串的计算结果可能相同,但情况并非总是如此。所以,kcfstreamslevel而不是“kcfstreamslevel”。我试图在我的iOS 7应用程序中使用CFReadStreamSetProperty,但Xcode 5.1.1告诉麻省理工学院“调用‘CFReadStreamSetProperty’时没有匹配的函数,尽管我有#import#import,而且我还添加了CFNetwork.framework和CoreFoundation.framework。有什么办法解决这个问题吗?