iOS上SSL连接出现错误

3
我有一个使用OpenSSL编写的服务器。我正在使用iOS客户端。在iOS上,我使用安全框架进行SSL连接。以下是连接到服务器的步骤:
  1. 创建SSL上下文

  2. 创建套接字并连接到服务器

  3. 设置证书

  4. 与服务器进行握手

但是,SSL握手返回错误代码-9807,即无效证书链,并且服务器仍在等待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++和Java客户端配合使用。 我不知道我缺少了什么。


我知道iOS只能使用有效证书而不能使用自签名证书。 - Alireza
我正在使用自签名证书。 - singh
@Alireza Aboutalebi:那么在iOS上没有使用自签名证书的方法吗? - singh
我不这么认为,市场上有一些低价的SSL证书,你应该去看看。 - Alireza
我已经将证书添加到机器上始终信任的列表中。 - singh
也许这可以帮助您:https://developer.apple.com/library/ios/technotes/tn2232/_index.html - Benjamin RD
3个回答

0

在iOS中使用自签名SSL证书可以通过一种变通的方式完成,但是强烈建议不要这样做,而是使用受信任的证书。此外,苹果可能会拒绝使用自签名证书的应用程序。


0

0

给旧线程带来新生!

我猜你正在使用的代码是用于研究或学术工作之类的。

由于你正在使用自签名证书,你可以将其添加到 iPhone 的受信任证书中,然后尝试连接。这应该可以解决问题。但是,这种方法仅适用于研究,不应用于任何你想发布到应用商店的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接