libcurl curl CURLE_SSL_CONNECT_ERROR(35)错误。网站使用了cdn的ssl证书的情况下,curl请求经常失败。

libcurl curl curle_ssl_connect_error (35)错误。

目标网站使用了cdn的ssl证书,openssl是1.1.1版本,curl请求经常失败。错误提示为CURLE_SSL_CONNECT_ERROR

 

  1. 这个帖子的方法: https://github.com/curl/curl/issues/9024#issuecomment-1266787007
static CURLcode rslctx(CURL *curl, void *sslctx, void parm)
{
SSL_CTX_set_options((SSL_CTX*)sslctx, SSL_OP_IGNORE_UNEXPECTED_EOF);
return CURLE_OK;
}

并调用如下:

curl_easy_setopt(ch, CURLOPT_SSL_CTX_FUNCTION, rslctx);

这里的调用,需要OpenSSL 3.x版本(此处使用的是3.0.8版本)。即,需要将openssl从1.1升级到3.0。

 

OpenSSL的源码编译:https://github.com/openssl/openssl/blob/master/NOTES-WINDOWS.md

编译之后,再编译libcurl(依赖OpenSSL)。

然后再编译当前工程(上面的代码修改需要链接libcrypto.lib库)。

 

实测,这个方法不行。

 

2. 回想起使用浏览器打开这个域名时,曾多次跳转到其他站点,说明域名被DNS劫持。由此推测,可能curl的上述报错,仅仅是因为DNS劫持。因为其他域名没有这样的问题。

3. 有说升级nss的,yum -y update nss。但这里的服务器使用的是cdn,所以,升级服务器没用,因为错误发生在和cdn建立连接之时。

4. 设置 CURLOPT_SSLVERSION。例如:curl_setopt(curl, CURLOPT_SSLVERSION,3);  但多次跟踪结果,有时候TLS1.2成功,有时候TLS1.3成功。失败的时候即使卡在SSL握手第一步。

 

最终解决方法:

1 程序使用了OpenSSL版本的curl库。需要加入 libcrypto和libssl的dll文件。

2 如果是HTTP代理访问HTTPS站点,此时提示错误码28超时。此时需要:

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_PROXY_SSL_VERIFYHOST, 0);

3 使用了curl_multi_socket_action。应当换成curl_multi_perform或curl_easy_perform,则正常。如果需要即时响应,可以使用curl_multi_poll+ curl_multi_perform 组合。相对于其他事件模型,curl_multi_poll等待时,无法响应其他事件,但可以通过超时时间解决。缺点就是,无法及时响应其他线程的事件,但考虑到curl一般为小频率的请求,对其他线程的事件请求的响应,可以有一定的延迟。

 

至此,解决。主要是2和3两个所致。

 

 

转载请注明来源,谢谢。

有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:[email protected]


老刀的技术日志 » libcurl curl CURLE_SSL_CONNECT_ERROR(35)错误。网站使用了cdn的ssl证书的情况下,curl请求经常失败。

发表评论