【问题标题】:SSL connection on iOS erroriOS 上的 SSL 连接错误
【发布时间】:2014-09-27 12:23:36
【问题描述】:

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

  1. 创建 SSL 上下文

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

  3. 设置证书

  4. 与服务器握手

SSLHandshake 返回 -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 Aboutalebi:那么有没有办法在ios上使用自签名证书?
  • 我不这么认为,市场上有一些低价的ssl你应该检查一下
  • 我已添加证书以始终信任机器

标签: ios iphone c ssl ssl-certificate


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这个问题是: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

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      为旧线程注入活力!

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-18
        • 2011-03-18
        • 2014-02-06
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        • 2016-05-07
        相关资源
        最近更新 更多