2014-09-27 2 views
3

У меня есть сервер, который написан на C++ с использованием OpenSSL. Клиент, который я использую, предназначен для iOS. Я использую систему безопасности для SSL на iOS. Для подключения к серверу вот что я делаю.SSL-соединение при ошибке iOS

  1. Создание SSL контекста

  2. Создание сокета и подключения к серверу

  3. Установить сертификаты

  4. ли рукопожатие с сервером

SSLHandshake возвращает -9807 недопустимый сертификат e и на серверной стороне Сервер все еще ждет SSL_Accept.

Вот код

-(int)SSLInitClientSocket 
{ 
@try 
{ 

    UINT uitimeout = 40 ; 
    int inret = 1,err=-1; 
    int verify_client = 1; 

    m_sslCTX= SSLCreateContext(NULL, kSSLClientSide, kSSLStreamType); 
    if (!m_sslCTX) 
    { 
     //ERR_print_errors_fp(stderr); 
     printf("\n ERROR in SSL_CTX_new \n"); 
     return OS_SOCK_ERROR; 
    } 

    //Socket is created using socket() function 
    if (OS_SockCreate(&listenerSocket, OS_TCP_SOCK, FALSE) != OS_SOCK_OK) 
    { 
     CFRelease(m_sslCTX); 
     //SSL_CTX_free(m_sslCTX); 
     m_sslCTX = NULL; 
     return OS_SOCK_ERROR; 
    } 


    fcntl(listenerSocket, F_SETFD, O_NONBLOCK); 

    /* Setting the socket to ignore Nagle Algorithm */ 
    OS_SockSetOpt(listenerSocket, TCP_OPT_NODELAY, &inret); 

    /* Set Timeout for send and recv */ 
    OS_SockSetOpt(listenerSocket, TCP_OPT_RCVTIMEOUT, &uitimeout); 
    OS_SockSetOpt(listenerSocket, TCP_OPT_SNDTIMEOUT, &uitimeout); 
    OS_SockInfo sockinfo; 
    strcpy(sockinfo.strName,"172.16.30.209"); 
    sockinfo.usPort = 5212; 
    //connected using connect 
    if(OS_SockConnect(listenerSocket, &sockinfo) != OS_SOCK_OK) 
    { 
     printf("ERROR :: OS_SockConnect \n"); 
     return OS_SOCK_ERROR; 
    } 

    OSStatus osstatus; 

    osstatus = SSLSetIOFuncs(m_sslCTX, readFromSocket,writeToSocket); 
    if(osstatus) { 
     return OS_SOCK_ERROR; 
    } 


    //connectionRef = (SSLConnectionRef)listenerSocket; 
    err=SSLSetConnection(m_sslCTX,(SSLConnectionRef)listenerSocket); 
    if ((err)==-1) 
    { 

     return OS_SOCK_ERROR; 
    } 
    SSLSessionState state; 
    SSLGetSessionState(m_sslCTX, &state); 

    osstatus = SSLSetProtocolVersionMin(m_sslCTX,kTLSProtocol1); 

    //Set certificates 
    if(verify_client == 1) 
    { 
     CFArrayRef arrcert = CFArrayCreate(NULL, 0, 0, NULL); 
     NSData *certData = [[NSData alloc] 
          initWithContentsOfFile:@"/Users/xyz/Desktop/cert/client.p12"]; 
     CFDataRef myCertData = (CFDataRef)certData; 
     const void *keys[] = { kSecImportExportPassphrase}; 
     const void *values[] = { CFSTR("password")}; 


     CFDictionaryRef options = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, NULL, NULL); 

     SecPKCS12Import(myCertData, options, &arrcert); 
     CFRelease(options); 
     CFDictionaryRef item = CFArrayGetValueAtIndex(arrcert, 0); 


     SecIdentityRef identity = (SecIdentityRef)CFDictionaryGetValue(item, kSecImportItemIdentity); 
     CFArrayRef certs = CFArrayCreate(kCFAllocatorDefault, (const void **)&identity, 1, NULL); 

     err=SSLSetCertificate(m_sslCTX,certs); 

    } 

    SSLGetSessionState(m_sslCTX, &state); //Here Session state is Idle 


    do 
    { 
     err = SSLHandshake(m_sslCTX); 

    } while (err == errSSLWouldBlock); 

    SSLGetSessionState(m_sslCTX, &state); //here session state is idle and the server is still blocked on SSL_Accept 


    return OS_SOCK_OK; 
} 
@catch(...) 
{ 
    return OS_SOCK_ERROR; 
} 

} 

Мой код сервер отлично работает с C++ и ява клиентов. Я не знаю, чего у меня нет.

+0

Я знаю, что ios работает только с действующим сертификатом, а не с самоподписанным сертификатом –

+0

Я пользуюсь самоподписанным сертификатом – singh

+0

@Alireza Aboutalebi: Так нет способа использовать самоподписанный сертификат на ios? – singh

ответ

0

Использование самоподписанного SSL-сертификата в iOS может быть выполнено с какой-то работой, но настоятельно рекомендуется не делать этого и вместо этого использовать доверенный сертификат. Кроме того, Apple может отклонить приложения, использующие самозаверяющие сертификаты.

0

Эта проблема: NSOSStatusErrorDomain errSSLXCertChainInvalid Если вы используете OpenSSL ваш может попробовать с:

$ openssl s_client -connect www.apple.com:443

openssl s_client -showcerts -host www.apple.com -port 443

Вы можете получить больше ссылок о здесь: https://developer.apple.com/library/ios/technotes/tn2232/_index.html https://developer.apple.com/library/mac/navigation/index.html#topic=Sample+Code&section=Resource+Types

Я надеюсь, что это может помочь

Смежные вопросы