libcurl访问AWS S3报SSL_ERROR_ZERO_RETURN但curl命令正常如何解决
问题根因分析
- 强制指定了不兼容的加密套件:代码中通过
CURLOPT_SSL_CIPHER_LIST指定了TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,但从命令行输出可以看到AWS S3的证书为RSA签名类型,成功握手使用的套件是ECDHE-RSA-AES128-GCM-SHA256,你指定的ECDSA类型套件与服务端证书不匹配,导致服务端直接中断握手,返回SSL_ERROR_ZERO_RETURN错误。 CURLOPT_USE_SSL参数配置错误:CURLUSESSL_CONTROL是为FTP等支持分层SSL的协议设计的,仅对控制链路开启SSL,HTTPS协议场景下不需要配置该参数,libcurl会自动根据URL的https前缀启用全链路SSL。
修正后的配置代码
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); // 若使用默认写文件逻辑可保留CURLOPT_WRITEFUNCTION为NULL,需确保fp为二进制写模式打开的文件指针 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 移除错误的CURLOPT_USE_SSL配置,HTTPS场景无需额外设置 curl_easy_setopt(curl, CURLOPT_CAINFO, "cert.pem"); // 移除强制加密套件配置,让libcurl使用默认协商逻辑匹配服务端支持的套件 // 若需要限制加密套件,可设置为和命令行一致的RSA类型套件:"ECDHE-RSA-AES128-GCM-SHA256"
可选补充配置(与curl命令行行为完全对齐)
如果需要和curl命令行的默认行为完全一致,可额外添加以下配置:
- 设置和命令行一致的User-Agent:
curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.58.0"); - 开启ALPN协商支持:
curl_easy_setopt(curl, CURLOPT_ALPN_ENABLE, 1L); - 确保写入文件的指针以
wb二进制模式打开,避免Windows平台下换行符转换损坏下载的文件。
内容的提问来源于stack exchange,提问作者Manjunath S
相关产品推荐
相关产品推荐

