iOS上的SSL连接错误 我有一个用OpenSSL编写的C++服务器。我使用的客户端是用于iOS的。我正在iOS上使用SSL安全框架。在这里连接到服务器就是我要做的

iOS上的SSL连接错误 我有一个用OpenSSL编写的C++服务器。我使用的客户端是用于iOS的。我正在iOS上使用SSL安全框架。在这里连接到服务器就是我要做的,ios,iphone,c,ssl,ssl-certificate,Ios,Iphone,C,Ssl,Ssl Certificate,创建SSL上下文 创建套接字并连接到服务器 设置证书 与服务器握手 SSLHandshake返回-9807错误无效证书链,服务器端仍在等待SSL\u接受 这是密码 -(int)SSLInitClientSocket { @try { UINT uitimeout = 40 ; int inret = 1,err=-1; int verify_client = 1; m_sslCTX= SSLCreateContext(NULL, kSSLClientSid

创建SSL上下文

  • 创建套接字并连接到服务器

  • 设置证书

  • 与服务器握手

  • SSLHandshake返回-9807错误无效证书链,服务器端仍在等待SSL\u接受

    这是密码

    -(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中使用自签名SSL证书可以通过某种方式解决,但强烈建议不要这样做,而是使用受信任的证书。此外,苹果可能会拒绝使用自签名证书的应用程序

    此问题是:
    nsossStatUserRorDomain errSSLXCertChainInvalid
    如果您使用的是
    OpenSSL
    ,您可以尝试:

    $openssl s_客户端-连接www.apple.com:443

    openssl s_客户端-showcerts-host www.apple.com-port 443

    您可以在此处获得更多有关的参考资料:


    我希望它能帮助

    给旧线程带来生命

    我假设您使用的代码是用于研究或学术工作


    由于您使用的是自签名证书,您只需将其添加到iPhone上的受信任证书中,然后尝试连接即可。它应该会起作用。但是,此方法仅用于研究,不应用于您希望发布到应用商店的任何内容。

    我知道ios仅适用于有效证书,而非自签名证书我使用的是自签名证书certificate@AlirezaAboutalebi:那么在ios上没有办法使用自签名证书吗?我不这么认为,市场上有一些低价格的ssl,你应该检查一下。我已经添加了证书,以便在机器上始终信任