iOS и Erlang - сбой рукопожатия SSL с самозаверяющими сертификатами

Я пытаюсь создать SSL-соединение по TCP/IP с iOS на сервер Erlang. Сервер использует самозаверяющие сертификаты (сертификаты по умолчанию, поставляемые с Erlang OTP).

Каждый раз происходит сбой SSL Handshake: - CFNetwork SSLHandshake сбой (-9824 -> -9829) - CFNetwork SSLHandshake сбой (-9807)

Это один метод, который я использую:

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"my-server-name", 1234, &readStream, &writeStream);

//------------------------------------------------------
// Set props.
//
CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL);
CFReadStreamSetProperty(readStream, kCFStreamSSLAllowsExpiredCertificates, kCFBooleanTrue);
CFReadStreamSetProperty(readStream, kCFStreamSSLAllowsExpiredRoots, kCFBooleanTrue);
CFReadStreamSetProperty(readStream, kCFStreamSSLAllowsAnyRoot, kCFBooleanTrue);
CFReadStreamSetProperty(readStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(readStream, kCFStreamSSLPeerName, kCFNull);

CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelNegotiatedSSL);
CFWriteStreamSetProperty(writeStream, kCFStreamSSLAllowsExpiredCertificates, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamSSLAllowsExpiredRoots, 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);

Я пытался также с SecureTransport (SSLCreateContext, SSLSetConnection, SSLHandshake и это то же самое - SSL рукопожатие не удается.

Любое предложение очень ценится.

2 ответа

Есть много возможных причин ошибки. Вы, вероятно, должны начать с использования curl Команда на вашем Mac для доступа к серверу Erlang. Curl даст вам больше описательных ошибок. Вам нужно будет пройти -k флаг, чтобы сказать, чтобы игнорировать ошибочные сертификаты.

Некоторые быстрые возможности: установлен ли ваш код Objective C для недействительных сертификатов? Это установлено для проверки доменного имени, и ваши настройки разработки не делают обратный DNS?

Если проблема связана с AppTransport, вы можете найти, какое исключение вам нужно, запустив /usr/bin/nscurl --ats-diagnostics --verbose yourdomain.com на MacOS 10.11.

Другие вопросы по тегам