2010-02-10 16 views
8

NSStream'in iphone'daki SSL işlevlerini kullanan bir uygulama yazıyorum. SSL'nin çalıştığını biliyorum çünkü sunucuları doğrudan SSL kullanarak bağlayabiliyorum.
Starttls kullanan protokollerin güvenli olmayan yuvada iletişim kurmamı, starttls komutunu göndermesini ve ardından aynı soketi SSL için kullanmamı gerektiren bir sorunla karşılaştım. Bildiğim kadarıyla nsstream bağlantıları yeniden kullanılamaz ve ben bağlantıyı açtıktan sonra onlardan SSL başlatamıyorum.Kullanılan soket üzerindeki NSStream SSL

Kendi prizimi oluşturmayı, üzerinde el ile iletişim kurmayı ve ardından varolan soketi kullanarak bir NSstream kurmayı ve SSL'yi bu şekilde başlatmayı düşündüm. Ancak, yuvadaki iletişimin, SSL'yi başlatamadığım bir duruma yerleştirdiği anlaşılıyor. Soketi nsstream için kullanma denemesi bir hatayla sonuçlanır.

Herhangi bir düşünce?

+0

Eğer setProperty çağıran denediniz uygun güvenlik sabitleri ile Zaten açık bir NSSocket üzerinde? Altta yatan SecureTransport kodunun, şifrelenmemiş bir ilk bağlantıdan TLS/SSL'ye geçişi desteklediğine inanıyorum. –

+0

Ben de bunu anladım. CFsockets kullanmalı ve NSsockets kullanmamalı ve daha sonra SSL'yi uygulayabilmeniz gerekir, ancak belgelerin bunu yapamayacağınızı söylemesine rağmen, güvenli bir bağlantı için doğru bir şekilde anlaşılacaktır. – anurodhp

+0

"NSsockets" diye bir şey yoktur – user102008

cevap

7

Bunu yapmanın doğru yolu budur. Bunu yaparken (soket bağlantısı sonrası özelliği ayarlama) belgesiz, bu benim Monal xmpp istemciden doğrudan kod ve elma bana uygulama mağazasında herhangi bir sorun verdi. Bağlantı açıldı ve NSStreamEventOpenCompleted almak ve STARTTLS istemciden ana bilgisayara gönderilen komutu sonra

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

Dizeler halinde sarmak yerine sabitleri kullanmak daha iyi bir fikir olabilir; Bu durumda sabitler ve dizgiler aynı sonucu değerlendirebilir, ancak bu her zaman böyle değildir. Yani, "kCFStreamSSLLevel" yerine kCFStreamSSLLevel. –

+0

iOS 7 uygulamamda CFReadStreamSetProperty kullanmaya çalışıyorum, ancak Xcode 5.1.1, "CFReadStreamSetProperty" öğesine çağrı için eşleştirme işlevine sahip olmamasına rağmen #import #import < Ayrıca CoreFoundation/CFStream.h> ve CFNetwork.framework ve CoreFoundation.framework'ı da ekledim. –