[英]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
到
添加这个:
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 0);
我有同样的错误,对我来说效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.