【问题标题】:Curl request is failing on the SSL?卷曲请求在 SSL 上失败?
【发布时间】:2011-04-22 01:14:39
【问题描述】:

我有这个代码

    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

关于原因的任何想法

【问题讨论】:

标签: php curl libcurl


【解决方案1】:

使用 SSL,确保您已从 php.ini 开启 openssl extension

【讨论】:

  • 如何打开它?
  • 如果您使用的是 WAMPP 或 XAMPP,则在 PHP.ini 文件中,但启用它后,我仍然有相同的错误代码
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    添加这个:

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

    我遇到了同样的错误,并且对我来说工作正常。

    【讨论】:

    • 如果验证关闭,为什么还要使用 HTTPS?
    • 如果您信任该频道,您可以忽略标志验证主机,加密有效,但您不需要检查证书
    • 这只会使连接容易受到 MITM 攻击(请参阅this)。
    • 否,如果您使用此 curl 从自己的网络获取数据,读取未加密的数据并不意味着攻击,有时您不需要加密此数据。
    【解决方案4】:

    我在使用第三方库时遇到了类似的神秘错误。我尝试了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。有错误的主机名...

    【讨论】:

    • 我得到了 errno 104,实际上它也是 56,谢谢!
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      在检查了 php curl 模块、GuzzleHttp 版本、openssl 版本后,我在浏览器中调用了链接,它工作正常。但是在控制台上使用curl --tlsv1 -kv @987654321@ 仍然有错误。

      所以我检查了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;
      

      【讨论】:

      • 在我的情况下,我还需要将 ssl_protocols 限制为 TLSv1.2,因为 v1 和 v1.1 与我的其他环境冲突。
      【解决方案7】:

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

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

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

      这里描述了一切sslforfree.com

      【讨论】:

        猜你喜欢
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 2019-07-07
        • 2022-01-07
        • 1970-01-01
        • 2018-09-20
        相关资源
        最近更新 更多