【问题标题】:SSL connect error cannot send tlsv1.2SSL 连接错误无法发送 tlsv1.2
【发布时间】:2017-02-23 12:50:08
【问题描述】:

Curl 失败错误 SSL 连接错误

服务器开放 SSL 版本: OpenSSL 1.0.1e-fips 2013 年 2 月 11 日 建立于:2016 年 5 月 9 日星期一 07:30:30 CDT

服务器卷曲-V: curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2

卷码:

$ch = curl_init();
    curl_setopt($ch, CURLOPT_PROXY, $this->config_proxy);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/xml', 'Expect: '));
    curl_setopt($ch, CURLOPT_URL, $this->url);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, $this->config_timeout);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSLVERSION, 6);
    curl_setopt($ch, CURL_SSLVERSION_TLSv1, 1);
    $output = curl_exec($ch);
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

是否有任何可能的方式来运行此 curl,而无需在服务器上更新 curl 版本,因为我的客户端建议不要在服务器上更新 curl 版本

【问题讨论】:

  • 我尝试了类似问题的答案中给出的所有选项,但没有一个适用于我的案例。

标签: php ssl curl


【解决方案1】:

这是 SSL 握手,你的网络服务器的日志说什么? 您可以使用流上下文并将其设置为使用所有密码,如下所示:

    $context = stream_context_create(array(
        'ssl' => array(
            // set some SSL/TLS specific options
            'verify_peer' => false,
            'verify_peer_name' => false,
            'allow_self_signed' => true,
            'ciphers' => 'ALL'
        )
    ));

或者,您可以尝试在 curl 中设置 SSL 密码列表,例如:

curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA');

【讨论】:

  • 在没有代理的情况下也试过了,服务器说同样的错误,SSL 连接错误,HTTP 响应代码 0
  • 这可能意味着 SSL 握手失败。您可以连接到其他页面,例如 google.com 吗?您的网络服务器日志文件(例如 Apache 日志)中应该有 SSL 握手错误的错误消息。您可以从日志中发布错误吗?
  • 是的,许多其他 curl 运行良好,所以我确定问题出在 SSL 握手中,很抱歉我在服务器上找不到 Apache 错误日志。
  • apache 错误日志文件可以在 /var/log/apache2/error.log 或其他路径中找到,具体取决于您的 vhost 配置。去年 9 月我遇到了同样的问题,真正的问题是服务器强制使用在新 PHP 版本中默认禁用的密码。所以解决方法是启用所需的密码。您可以尝试启用所有密码并一一删除。
  • 使用 curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-SHA') 不起作用
【解决方案2】:

当您尝试访问安全页面 (https://) 的 URL 时发生此问题。

试试这个。

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

它在我的情况下工作。

【讨论】:

  • 这不是一个解决方案,您正在尝试关闭证书验证,它只会在服务器使用自签名证书并且您想绕过证书验证的情况下有所帮助。除非您信任自己尝试连接的服务器(例如当它是您自己的服务器时),否则不建议在生产中使用此设置。
猜你喜欢
  • 2014-11-07
  • 2017-04-11
  • 2019-11-01
  • 2017-10-22
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
相关资源
最近更新 更多