Frage

Ich schreibe eine Anwendung, die NSStream SSL-Funktionen auf dem iPhone verwendet. Ich weiß, dass SSL funktioniert, weil ich direkt Connect-Server mit SSL.
Ich habe ein Problem festgestellt, wo Protokolle, dass die Verwendung starttls mich erfordern auf dem Sockel mit ungesicherten zu kommunizieren, senden die STARTTLS-Befehl und dann die gleiche Buchse für SSL wiederverwenden. Soweit ich weiß, nsstream Verbindungen können nicht wiederverwendet werden, und ich kann SSL nicht auf sie beginnen, nachdem ich die Verbindung geöffnet haben.

Ich dachte an meine eigene Fassung erstellen, auf sie manuell in Verbindung steht und dann ein NSstream die vorhandene Buchse mit der Einrichtung und starten SSL auf diese Weise. Es scheint jedoch, die Kommunikation über den Sockel platziert sie in einem Zustand, in dem ich SSL auf es beginnen kann nicht. Jeder Versuch, verwenden Sie die Buchse für nsstream zu einem Fehler führt.

Alle Gedanken?

War es hilfreich?

Lösung

Dies ist der richtige Weg, dies zu tun. während dies zu tun (die Eigenschaft, nach dem Socket-Verbindung Einstellung) nicht dokumentiert ist, ist dieser Code direkt von meinem Monal xmpp Client und Apple hat im App Store nie gegeben mir keine Probleme.

 NSInputStream *iStream;
NSOutputStream *oStream;


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


[iStream open];
    [oStream open];

Sobald die Verbindung geöffnet wurde und Sie NSStreamEventOpenCompleted erhalten und den STARTTLS-Befehl an den Host wurde von den Client gesendet:

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top