You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++使用Curl请求HTTPS接口出现SSL_read错误无法获取返回内容排查

问题原因分析

  • 特定HTTPS CGI服务端未遵循SSL/TLS正常关闭流程:CGI程序生成返回内容后直接关闭TCP连接,未发送SSL层的close_notify通知,OpenSSL默认将该行为判定为异常中断,抛出对应错误
  • TLS版本/加密套件协商不兼容:该CGI服务端仅支持特定版本的TLS协议,与Curl默认协商的TLS版本不匹配
  • HTTP协议版本兼容性问题:Curl默认尝试协商HTTP/2,该CGI服务端对HTTP/2的HTTPS请求支持异常
  • HTTPS数据包MTU适配问题:HTTPS加密后数据包大小超过链路MTU被丢弃,HTTP无加密开销数据包更小可正常传输
  • 若为POST请求,服务端不支持chunked编码的请求体,收到请求后直接中断连接

排查解决步骤

  1. 开启Curl调试日志定位阶段
    添加代码开启verbose日志,确认故障发生在SSL握手完成后的数据传输阶段还是握手阶段:

    curl_easy_setopt(m_curl, CURLOPT_VERBOSE, 1L);
    

    从日志中可查看协商得到的TLS版本、加密套件、HTTP协议版本信息,确认是否有协商异常。

  2. 强制指定HTTP/1.1协议
    优先尝试禁用HTTP/2协商,强制使用兼容性更好的HTTP/1.1:

    curl_easy_setopt(m_curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    
  3. 忽略SSL关闭通知异常
    针对服务端未发送close_notify直接断连的场景,添加选项忽略该类错误,保留已接收的有效数据:

    curl_easy_setopt(m_curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_IGNORE_CLOSURE_NOTIFY);
    
  4. 手动指定TLS版本
    依次尝试指定不同TLS版本测试兼容性:

    // 依次替换为CURLOPT_SSLVERSION_TLSv1_1 / CURLOPT_SSLVERSION_TLSv1_2 / CURLOPT_SSLVERSION_TLSv1_3测试
    curl_easy_setopt(m_curl, CURLOPT_SSLVERSION, CURLOPT_SSLVERSION_TLSv1_2);
    
  5. POST请求特殊处理
    若该请求为POST请求,手动指定请求体长度,禁用chunked编码:

    curl_easy_setopt(m_curl, CURLOPT_POSTFIELDSIZE, (long)postBody.size());
    
  6. 命令行对照测试
    使用Curl命令行工具模拟请求,对比参数差异:

    curl -v --http1.1 --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" "你的HTTPS CGI接口地址"
    

    若命令行请求正常,对照命令行的默认参数调整代码中的Curl配置即可。

代码优化建议

你当前代码中重复设置了两次CURLOPT_SSL_VERIFYPEER,属于冗余配置可直接删除重复项;注释掉的CURLOPT_RETURNTRANSFER不需要开启,该参数仅在不自定义WRITEFUNCTION时使用,和你的现有逻辑不冲突。


内容的提问来源于stack exchange,提问作者montjet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:45:04