2009-12-23 5 views
8

Recientemente necesité configurar CocoaHttpServer, que estamos utilizando en nuestra aplicación con éxito, para manejar conexiones HTTPS provenientes de una aplicación cliente (que se ejecuta en dispositivos Android). Esto está bien, hay un código de muestra abundante que permite esto, y pudimos habilitar el servidor seguro sin problemas.¿Cómo se establecen los cifrados SSL cuando se usa CFSocket/CFStream en Cocoa?

En la práctica, estábamos viendo fases de negociación SSL increíblemente largas mientras el cliente estaba haciendo su intercambio de manos con nuestro servidor: más de 70 segundos.

A través de una larga serie de búsquedas, encontré que la demora se debía al cálculo de los parámetros de Diffie-Hellman utilizados por defecto cuando SSL está habilitado en CFSocket. Este thread es donde comencé a encontrar la respuesta a mi problema.

Para que coincida con lo que nuestro servidor Windows estaba haciendo (utilizando un cifrado SSL menos seguro) Necesitaba configurar el cifrado explícitamente en la Mac, lo cual no es fácil cuando se usa AsyncSocket como contenedor para las comunicaciones de socket.

servidor

Nuestra Windows no usando: TLS_RSA_WITH_RC4_128_MD5) (0x04) RC4 128 bits MD5 de RSA

servidor

Nuestra Macintosh estaba usando: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x039) AES de 256 bits SHA-1 efímero de Diffie-Hellman de intercambio de claves utilizando el certificado RSA

La diferencia en "seguridad" es grande, pero probablemente no vale la pena el esfuerzo/cálculo/demora que estábamos viendo. ¿Teatro de seguridad?

+0

A +1 por sus esfuerzos, y por trabajar la frase "Security Theatre?" en su publicación :-) –

+1

Esto es útil, pero debe dividir la respuesta y publicarla como respuesta a esta pregunta, para que no viva para siempre en la página No contestada. (Es totalmente kosher responder tu propia pregunta). – benzado

Respuesta

4

Tenga en cuenta que hay diferentes cifrados que se pueden elegir: elegí utilizar el mismo como nuestra implementación de Windows para la coherencia.

Con información de another question mencionado anteriormente, me di cuenta de cómo configurar el sistema de cifrado para CFSocket utilizar la misma como Windows, y el código parece ser ahora un poco mejor - al igual que lo que realmente funciona! CFSocket no está exponiendo directamente el soporte de SecureTransport, lo que hace que este tipo de disco sea difícil, pero definir una clave en particular lo hace funcionar muy bien.

Para la posteridad, aquí está el código que he añadido a -onSocketWillConnect: en nuestra clase HTTPConnection:

// define this value; it isn't exposed by CFSocketStream.h 
const extern CFStringRef kCFStreamPropertySocketSSLContext; 

...

CFReadStreamRef stream = [sock getCFReadStream]; 
CFDataRef data = (CFDataRef) CFReadStreamCopyProperty(stream, kCFStreamPropertySocketSSLContext); 

// Extract the SSLContextRef from the CFData 
SSLContextRef sslContext; 
CFDataGetBytes(data, CFRangeMake(0, sizeof(SSLContextRef)), (UInt8*)&sslContext); 
SSLCipherSuite *ciphers = (SSLCipherSuite *)malloc(1 * sizeof(SSLCipherSuite)); 
ciphers[0] = SSL_RSA_WITH_RC4_128_MD5; // Basic cipher - not Diffie-Hellman 
SSLSetEnabledCiphers(sslContext, ciphers, 1); 

espero que esto ayude a trabajar a través de la misma edición como yo, me gustaría compartir más códigos y consejos si es necesario.

0

Por lo que vale, contribuí con patch a CocoaAsyncSocket aproximadamente una semana antes de tener este problema. Lamento que no haya notado su pregunta en ese momento. :-)

Cuestiones relacionadas