Jeh*_*joa 7 c++ ssl winapi schannel libcurl
我正在制作个人使用的程序,定期擦除几个网页.其中一个需要使用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, "");
Run Code Online (Sandbox Code Playgroud)
我已经尝试过同时设置CURLOPT_SSL_VERIFYHOST
和CURLOPT_SSL_VERIFYPEER
为0,但是这并没有帮助.
我内置的libcurl从curl-7.43.0.tar.gz
与nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes
在Visual Studio中2013.
这里发生了什么,我该如何解决?
小智 3
我猜测您正在使用单个 CURL 句柄来处理所有请求(因为您说“我创建并初始化了”)。解决方案很可能是为每个使用curl_easy_perform()完成的请求创建一个CURL句柄,然后立即使用curl_easy_cleanup()它。
您所看到的情况可能是由服务器关闭 SSL 连接引起的。但是您的 CURL 句柄可能会保持原样(即握手完成),这不再合适。