卷曲请求在SSL上失败?

时间:2010-10-06 20:24:30

标签: php curl libcurl

我有这段代码

    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

关于原因的任何想法

7 个答案:

答案 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)

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

运行CURL请求之前,应为发送服务器生成SSL证书

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

这里描述了所有内容sslforfree.com

enter image description here

相关问题