gpt4 book ai didi

ios - iOS 上的 SSL 连接错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:03 27 4
gpt4 key购买 nike

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

关于ios - iOS 上的 SSL 连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26074628/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com