我正在制作个人使用的程序,定期搜索几个网页。其中一个需要使用SSL,其主URL实际上是一个负载均衡器,每次重定向到一个不同的域,从少数列表中(不确定这是否相关)。我对libcurl和SSL很陌生,所以我可能会遗漏一些明显的东西,但我不这么认为。
该程序运行良好一段时间(到目前为止,从不超过一小时),但一旦第一次收到SSL连接错误,它将每次都给出相同的错误。在开始失败之前,它总是一个不同的时间量和不同数量的成功请求。
错误缓冲区始终包含以下内容:schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326) - This error usually occurs when a fatal SSL/TLS alert is received (e.g. handshake failed). More detail may be available in the Windows System event log.
eventvwr
中没有任何用处。对该错误代码的搜索会返回有关早期版本的Windows Server上的自签名证书问题的结果,但很少有其他问题。我不控制我正在连接的服务器,但我怀疑它是一个Windows框。
我在这里已经没有想法了,所以我只想提供可能相关的任何细节。我不能真正发布任何实际的源代码,因为我已经在几个类中抽象了所有的curl调用,所以我必须粘贴很多样板代码才能让别人理解它。我已经使用Visual Studio调试器确认这是实际调用的结果。
在创建任何其他线程之前,我在主线程中初始化libcurl,如下所示:curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);
然后我在第二个线程中创建并初始化实际的curl句柄,并且仅在该线程中,如下所示:
m_handle = curl_easy_init();
curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, this);
curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, write);
curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, this);
curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, debug);
curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(m_handle, CURLOPT_ERRORBUFFER, &m_errormsg[0]);
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(m_handle, CURLOPT_COOKIEFILE, "");
我已经尝试将CURLOPT_SSL_VERIFYHOST
和CURLOPT_SSL_VERIFYPEER
设置为0,但这没有帮助。
我在Visual Studio 2013上使用curl-7.43.0.tar.gz
从nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes
构建了libcurl。
这里发生了什么,我该如何解决?
答案 0 :(得分:3)
我猜你正在为所有请求使用单个CURL句柄(因为你说"我创建并初始化 实际卷曲句柄&# 34)。该解决方案最有可能为每个使用curl_easy_perform()的请求创建一个CURL句柄,然后立即生成curl_easy_cleanup()。
您看到的内容可能是服务器关闭SSL连接造成的。但是你的CURL句柄可能保持其状态(即握手完成),这已不再合适。