SSL_connect devuelve SSL_ERROR_SYSCALL, errno == ESRCH

(iOS) Estoy intentando hacer SSL_connect con el sitio https: // login.11st. co.kr (estoy usando open ssl para extraer cadenas de certificates PEM):

así es como hago Tcp connect

struct TcpConnectionInfo { std::string ipAddress; int socketId; }; static TcpConnectionInfo TcpConnect(const char *host, int port) { TcpConnectionInfo resultInfo; resultInfo.socketId = kInvalidSocketId; // TODO: gethostbyname is depricated, should replace with another struct hostent *hp = gethostbyname(host); if (hp == NULL) { DLog(@"Couldn't resolve host"); return resultInfo; } struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_addr = *(struct in_addr*)hp->h_addr_list[0]; addr.sin_family = AF_INET; addr.sin_port = htons(port); int socketId = (int)socket(AF_INET,SOCK_STREAM, IPPROTO_TCP); if (socketId < 0) { DLog(@"Couldn't create socket"); return resultInfo; } int connectResult = connect(socketId, (struct sockaddr *)&addr, sizeof(addr)); if (connectResult < 0) { DLog(@"Couldn't connect socket"); return resultInfo; } resultInfo.socketId = socketId; resultInfo.ipAddress = inet_ntoa(addr.sin_addr); return resultInfo; } 

así es como lo estoy usando:

 TcpConnectionInfo connectInfo = TcpConnect(url.c_str(), port); SSL *ssl = SSL_new(ctx); BIO *sbio = BIO_new_socket(connectInfo.socketId, BIO_NOCLOSE); SSL_set_bio(ssl, sbio, sbio); int sslConnectResult = SSL_connect(ssl); 

Obtengo códigos de error con código:

 const int errorCode = SSL_get_error(ssl, sslConnectResult); DLog(@"SSL Error Code: %d", errorCode); DLog(@"errno: %d", errno); 

y para el sitio https: // login.11st. co.kr da

Código de error SSL: 5 errno: 3

que corresponde a

SSL_ERROR_SYSCALL, ESRCH (Sin este process)

Para otros sitios https todo bien. ¿Qué puede ser? No puedo entender este error. ¿Como puedo resolver esto? ¿Cómo depende de los processs?

Parece que el server no responde desde mi location:

 $ echo "GET / HTTP\1.0" | openssl s_client -showcerts -connect login.11st.co.kr:443 CONNECTED(00000003) ^C 

 SSL Error Code: 5 errno: 3 ... SSL_ERROR_SYSCALL, ESRCH (No such process) 

Esto no se ve bien. Cuando obtenga un código de error de OpenSSL, debería poder imprimirlo. El código de error suele ser un gran número hexadecimal:

 $ openssl errstr 5 error:00000005:lib(0):func(0):DH lib 

Aquí hay una que es más ilustrativa (es decir, lo que suele ser):

 $ openssl errstr 0x2606c043 error:2606C043:engine routines:ENGINE_FREE_UTIL:passed a null parameter 

 BIO *sbio = BIO_new_socket(connectInfo.socketId, BIO_NOCLOSE); SSL_set_bio(ssl, sbio, sbio); int sslConnectResult = SSL_connect(ssl); 

Por lo general, solo obtengo el código de error inmediatamente después de la operación. Si la operación tiene éxito, no uso el resultado porque no es necesario ni está definido. Si la operación falla, puedo usar el resultado porque está definido.

Mi connection BIO se vería así:

 unsigned long err; int res; ... BIO* web = BIO_new_ssl_connect(ctx); err = ERR_get_error(); if(web == NULL) { const char* const str = ERR_reason_error_string(err); fprintf(stderr, "%s\n", str); exit (err); } res = BIO_set_conn_hostname(web, HOST_NAME ":" HOST_PORT); err = ERR_get_error(); if(res != 1) { const char* const str = ERR_reason_error_string(err); fprintf(stderr, "%s\n", str); exit (err); } res = BIO_do_connect(web); err = ERR_get_error(); if(res != 1) { const char* const str = ERR_reason_error_string(err); fprintf(stderr, "%s\n", str); exit (err); } ... 

ERR_reason_error_string es el C equivalente al command openssl errstr .

Puede ver un ejemplo de un cliente basado en BIO en SSL / TLS Client .