我有这段代码
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
关于原因的任何想法
答案 0 :(得分:30)
我在使用第三方库时遇到类似的神秘错误。我尝试了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。有错误的主机名......
答案 1 :(得分:12)
使用SSL,请确保您已从php.ini启用openssl extension。
答案 2 :(得分:1)
我遇到了同样的问题。事实证明,目标系统上的ssl配置不正确。
在检查了php curl模块,GuzzleHttp版本之后,openssl版本我在浏览器中调用了链接并且它工作正常。但是在控制台上使用curl --tlsv1 -kv https://www.example.com
时仍然存在错误。
所以我在https://www.ssllabs.com/ssltest/检查了ssl配置它被评为B.并且在那里有一些我以前没见过的在线证书状态协议(OCSP)错误。最后,我将目标系统上的配置更改为https://cipherli.st/处的建议,重新启动了Web服务器,一切正常。 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;
答案 3 :(得分:0)
我认为你的意思是使用CURLOPT_SSL_VERIFYHOST,而不是使用CURLOPT_SSL_VERIFYPEER
答案 4 :(得分:0)
添加:
curl_setopt($ curl,CURLOPT_SSL_VERIFYHOST,0);
我遇到了同样的错误并且对我很好。
答案 5 :(得分:0)
我有函数curl_error
打印的相同错误,但这不一定与SSL有关。最好使用函数curl_errno
打印精确的错误编号,然后您可以从那里更好地进行诊断。在我的情况下,它返回了我52错误代码,我可以从那里调试,实际上其他服务器没有发送任何数据。
答案 6 :(得分:0)