iOS y Erlang: SSL Handshake falló con certificates autofirmados

Estoy intentando crear una connection SSL a través de TCP / IP desde iOS a un server Erlang. El server usa certificates autofirmados (los certificates pnetworkingeterminados se envían con Erlang OTP).

Cada vez que falla el apretón de manos SSL: – CFNetwork SSLHandshake falló (-9824 -> -9829) – CFNetwork SSLHandshake failed (-9807)

Este es un método que uso:

CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"my-server-name", 1234, &readStream, &writeStream); //------------------------------------------------------ // Set props. // CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); CFReadStreamSetProperty(readStream, kCFStreamSSLAllowsExpinetworkingCertificates, kCFBooleanTrue); CFReadStreamSetProperty(readStream, kCFStreamSSLAllowsExpinetworkingRoots, kCFBooleanTrue); CFReadStreamSetProperty(readStream, kCFStreamSSLAllowsAnyRoot, kCFBooleanTrue); CFReadStreamSetProperty(readStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse); CFReadStreamSetProperty(readStream, kCFStreamSSLPeerName, kCFNull); CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL); CFWriteStreamSetProperty(writeStream, kCFStreamSSLAllowsExpinetworkingCertificates, kCFBooleanTrue); CFWriteStreamSetProperty(writeStream, kCFStreamSSLAllowsExpinetworkingRoots, kCFBooleanTrue); CFWriteStreamSetProperty(writeStream, kCFStreamSSLAllowsAnyRoot, kCFBooleanTrue); CFWriteStreamSetProperty(writeStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse); CFWriteStreamSetProperty(writeStream, kCFStreamSSLPeerName, kCFNull); //------------------------------------------------------ // Open streams. // if(!CFReadStreamOpen(readStream)) { NSLog(@"CFReadStreamOpen Failed!"); return 0; } if(!CFWriteStreamOpen(writeStream)) { NSLog(@"CFWriteStreamOpen Failed!"); CFReadStreamClose(readStream); return 0; } //------------------------------------------------------ // Send some data. // UInt8 data[20] = {0}; *(ushort*)data = 18; for(int i = 2; i < 20; i++) { data[i] = 'A' + i; } NSLog(@"Sending some data..."); CFIndex bytesSent = CFWriteStreamWrite(writeStream, data, 20); NSLog(@"Bytes Sent: %d", (int)bytesSent); //------------------------------------------------------ // Close streams. // CFReadStreamClose(readStream); CFWriteStreamClose(writeStream); 

Intenté también con SecureTransport (SSLCreateContext, SSLSetConnection, SSLHandshake y es lo mismo, falla el protocolo de enlace SSL.

Cualquier sugerencia es muy apreciada.

Existen muchos posibles motivos para el error. Probablemente debería comenzar usando el command curl en su Mac para acceder al server Erlang. Curl te dará más errores descriptivos. Deberá pasar la bandera -k para decirle que ignore los errores cert.

Algunas posibilidades rápidas: ¿Se ha configurado su código Objective-C para permitir certs inválidos? ¿Está configurado para validar el nombre de dominio y su configuration de desarrollo no hace DNS inverso?

Si el problema está relacionado con AppTransport, puede encontrar qué exception necesita ejecutando /usr/bin/nscurl --ats-diagnostics --verbose yourdomain.com en MacOS 10.11.