繁体   English   中英

Curl 请求在 SSL 上失败了吗?

[英]Curl request is failing on the SSL?

我有这个代码

    if(ereg("^(https)",$url))
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
    // execute, and log the result to curl_put.log
    $result = curl_exec($curl);


    $error = curl_error($curl);

指定的错误是

SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

关于原因的任何想法

我在使用第三方库时遇到了类似的神秘错误。 我尝试了CURLOPT_SSL_VERIFY[PEER|HOST]但没有任何区别。 我的错误信息是类似的:

SSL read: error:00000000:lib(0):func(0):reason(0), errno 54

所以我访问了http://curl.haxx.se/libcurl/c/libcurl-errors.html ,寻找错误代码 54。

CURLE_SSL_ENGINE_SETFAILED (54) Failed setting the selected SSL crypto engine as default!

但是这是错误的 - 我在应用程序的其他部分使用 curl 发出其他 HTTPS 请求。 所以我继续挖掘并发现了这个问题, R & RCurl: Error 54 in libcurl ,它有这个宝石:

您看到的输出来自 libcurl 源代码中的 lib/ssluse.c,并且提到的“errno”不是 libcurl 错误代码,而是当时实际的 errno 变量。

所以,不要让curl_error()的输出误导你。 相反,使用curl_errno()获取正确的错误代码,在本例中实际上是 56,CURLE_RECV_ERROR。 有错误的主机名...

使用 SSL,请确保您已从 php.ini 启用openssl 扩展

我遇到了同样的问题。 事实证明,目标系统上的 ssl 配置错误。

在检查了 php curl 模块、GuzzleHttp 版本、openssl 版本后,我在浏览器中调用了该链接并且它工作正常。 但是使用curl --tlsv1 -kv https://www.example.com在控制台上仍然出现错误。

所以我检查了https://www.ssllabs.com/ssltest/ 上的 ssl 配置,它被评为 B。那里有一些我以前从未见过的在线证书状态协议 (OCSP) 错误。 最后,我将目标系统上的配置更改为https://cipherli.st/上的建议重新启动了网络服务器,一切正常。 ssllabs 的新评级现在是 A+。

我的 nginx 配置(Ubuntu 14.04,nginx 1.4.6-1ubuntu3.5):

ssl     on;
ssl_certificate /etc/ssl/certs/1_www.example.com_bundle.crt;
ssl_certificate_key     /etc/ssl/private/www.example.com.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
#ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify off; # Requires nginx => 1.3.7
ssl_dhparam /etc/ssl/private/dhparams.pem;
ssl_trusted_certificate /etc/ssl/startssl.ca.pem;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; www.example.com; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

函数curl_error打印了相同的错误,但这不一定与 SSL 相关。 最好使用函数curl_errno打印精确的错误编号,您可以从那里更好地诊断。 就我而言,它返回了 52 错误代码,我可以从那里进行调试,实际上另一台服务器没有发送任何数据。

我认为您的意思是使用 CURLOPT_SSL_VERIFYHOST,而不是 CURLOPT_SSL_VERIFYPEER

这意味着目标服务器需要 SSL 通信。

您应该从运行 CURL 请求的发送服务器生成 SSL 证书

Let's Encrypt 是第一个免费且开放的 CA

一切都在这里描述sslforfree.com

在此处输入图片说明

我解决了这个 curl 错误:“SSL read: error:00000000:lib(0):func(0):reason(0), errno 104”,方法是从我的 url 查询参数值(逗号分隔值)中删除额外的空间。

例如:

https://example.com?a=123,456,SPACE_ADDED_BY_MISTAKE789

https://例子.com?a=123,456,789

添加这个:

curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 0);

我有同样的错误,对我来说效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM