【问题标题】:cURL fails with error: Couldn't understand the server certificate formatcURL 失败并出现错误:无法理解服务器证书格式
【发布时间】:2016-12-07 01:03:42
【问题描述】:

Mac OSX El Capitan,默认 apache 安装在 localhost,brew 安装 php70。以下代码使用 cli (php -f test.php) 工作,但是当从 apache 运行时,我得到以下内容。

SSL certificate problem: Couldn't understand the server certificate format

使用“http”网址在这两种情况下都可以正常工作。在 Ubuntu 机器上进行相同的设置可以正常工作。在全新安装 El Capitan 之前,我已经完成了这项工作,我隐约记得 Mac OSX 和用于 curl 的 openssl,但在这里找不到区别。

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.example.com/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

【问题讨论】:

  • curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); ???你还在尝试吗?

标签: php macos apache curl


【解决方案1】:

我也遇到了同样的问题,找了好久才找到解决办法...

我正在使用php56,但我看不出为什么这不适用于php70

验证相同的问题

首先检查 PHP cURL 库是否使用 Mac OS(X) 内置 SSL 版本:
php -i | grep "SSL Version"

如果您收到SSL Version => SecureTransport,那么它使用的是 Mac OS(X) 内置版本,这似乎是问题的核心。

解决方案

  1. 为了解决这个问题,您必须安装 cURL 库的 Homebrew 版本:

    brew install curl --with-libssh2 --with-openssl
    
  2. 然后用这两个选项重新安装 PHP:
    --with-homebrew-curl--with-homebrew-openssl
    (包括您需要的任何选项)

    brew install php56 --with-homebrew-curl --with-homebrew-openssl (--with-apache ...)
    

    或者对于 PHP 7.2:

    brew reinstall php72 --with-apache --with-homebrew-curl --with-homebrew-libxslt --with-homebrew-openssl --without-snmp
    

验证

php -i | grep "SSL Version"

应该给:

SSL Version => OpenSSL/1.0.2j

注意:安装 Homebrew cURL 时会发出警告:

macOS 已提供此软件并在 并行会引起各种麻烦。

我没有足够长的时间来验证任何存在/不存在的问题。


来源:https://www.farces.com/wikis/naked-server/php/php-openssl/

【讨论】:

  • brew upgraded 今天受到了打击。随机它通过 CLI 运行良好(仍在使用 SecureTransport)但通过 apache,什么都没有......
  • 我建议将 php72 安装命令更改为 brew install php72 --with-httpd --with-homebrew-curl --with-homebrew-libxslt,因为没有可用的 --with-apache--with-homebrew-openssl--without-snmp 标志。
【解决方案2】:

没有找到关于此错误的太多文档,该错误源于达尔文 SSL 错误 -9808 errSSLBadCert

如果您使用 OpenSSL 而不是 Darwin SSL 编译 cURL,您可能会更幸运。

有关此错误的其他一些互联网搜索表明它可能无法读取您的钥匙串,但我不确定。

【讨论】:

  • 我对此进行了调查,但是从 CLI 调用的相同代码可以正常工作这一事实是否可以计算在内?该问题仅在从 Apache 调用时存在。
  • 在浏览器中比较来自 php -i<?php phpinfo() 的信息,看看它们是否运行不同的版本和/或针对不同 SSL 库编译的 curl 模块。有可能每一个都完全不同。
猜你喜欢
  • 2018-10-20
  • 2015-06-30
  • 2016-04-05
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
相关资源
最近更新 更多