iphone - para - NSStream SSL en un socket usado
zimbra mail server (1)
Estoy escribiendo una aplicación que usa las funciones SSL de NSStream en el iPhone. Sé que SSL funciona porque puedo conectar servidores directamente usando SSL.
He encontrado un problema donde los protocolos que usan starttls requieren que me comunique en el socket con no segura, envíe el comando starttls y luego reutilice el mismo socket para SSL. Por lo que sé, las conexiones nsstream no se pueden reutilizar y no puedo iniciar SSL en ellas después de haber abierto la conexión.
Pensé en crear mi propio socket, comunicarme con él manualmente y luego configurar un NSstream usando el socket existente e iniciar SSL de esa manera. Sin embargo, parece que la comunicación en el socket lo coloca en un estado en el que no puedo iniciar SSL. Cualquier intento de usar el socket para nsstream produce un error.
¿Alguna idea?
Esta es la forma correcta de hacer esto. al hacer esto (establecer la propiedad después de la conexión del socket) no está documentado, este es código directamente de mi cliente xmpp de Monal y Apple nunca me ha dado ningún problema en la tienda de aplicaciones.
NSInputStream *iStream;
NSOutputStream *oStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)server, port, &iStream, &oStream);
[iStream open];
[oStream open];
Una vez que se haya abierto la conexión, obtendrá NSStreamEventOpenCompleted y el comando startTLS se habrá enviado al host desde el cliente:
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);