我正在开发一个供个人使用的程序,该程序会定期抓取一些网页。其中一个需要使用 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
使用 with构建了 libcurl 。nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes
这是怎么回事,我该如何解决?