Php 如何调试或修复cURL errno 35

Php 如何调试或修复cURL errno 35,php,curl,Php,Curl,我试图在PHP中向URL发出一个cURL请求。无论我尝试什么,我总是得到一个(对于特定的URI)。curl文档包含以下内容: 您确实需要错误缓冲区,并在那里读取消息,因为它更准确地指出了问题。可以是证书(文件格式、路径、权限)、密码等 但是,当试图捕获此信息时,似乎没有返回任何信息 $client = curl_init('https://dev.kelunik.com/css/all.min.css') $log = fopen('/srv/www/Requestable/data/curl

我试图在PHP中向URL发出一个cURL请求。无论我尝试什么,我总是得到一个(对于特定的URI)。curl文档包含以下内容:

您确实需要错误缓冲区,并在那里读取消息,因为它更准确地指出了问题。可以是证书(文件格式、路径、权限)、密码等

但是,当试图捕获此信息时,似乎没有返回任何信息

$client = curl_init('https://dev.kelunik.com/css/all.min.css')

$log = fopen('/srv/www/Requestable/data/curl-log.txt', 'a+');

curl_setopt($client, CURLOPT_VERBOSE, 1);
curl_setopt($client, CURLOPT_STDERR, $log);
curl_setopt($client, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($client, CURLOPT_SSL_VERIFYHOST, 2)
curl_setopt($client, CURLOPT_CAINFO, __DIR__ . '/../../../../data/default.pem');
curl_setopt($client, CURLOPT_FAILONERROR, false);
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_HEADER, true);
curl_setopt($client, CURLINFO_HEADER_OUT, true);
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($client, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($client, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

if (!$response = curl_exec($client)) {
    throw new CurlException('Making request failed: ' . curl_error($client) . '(' . curl_errno($client) . ')');
}

fclose($log);
上面的代码总是抛出带有errno 35的
CurlException
,但是定义的日志文件保持为空

当尝试(使用来自同一CA的证书)时,它只起作用™. 我还检查了我的根CA捆绑包,它是:

Mozilla证书数据下载日期:2014年9月3日星期三03:12:03

我还可以检查什么来找出导致错误的具体原因

注意:可以从浏览器和本地开发环境中请求URI

注2:我也尝试了它,但没有手动设置自定义CA根束,这导致了相同的错误

OpenSSL版本:

Installed Packages
Name        : openssl
Arch        : x86_64
Version     : 1.0.1e
Release     : 30.el6_6.5
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
卷曲版本:

Installed Packages
Name        : openssl
Arch        : x86_64
Version     : 1.0.1e
Release     : 30.el6_6.5
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

问题与您的证书链无关,而是
dev.kelunik.com
上的服务器配置。服务器仅接受ECDHE密码()。另一台服务器接受范围更广的密码。(). 虽然您的OpenSSL支持ECDHE,但您使用的cURL版本是使用NSS编译的,而NSS不支持ECDHE

您可以将输出与

curl https://dev.kelunik.com

在不更改发行版的情况下,您有两种解决方案。如果您可以访问其他服务器的配置,则可以将SSL密码更改为使用DHE/RSA密码。确切的密码列表将取决于服务器配置——ssllabs在这方面有很好的优势


否则,您需要针对OpenSSL重新编译cURL以访问所有可用密码。基本说明可在。

上获得。我将您的代码放在test.php文件中,并在命令行上运行它 php test.php,它运行良好(在命令行上打印“done”)

下面是test.php的内容(代码中的小修改)。我的php版本是Zend Engine v2.4.0,在Ubuntu 12.04上运行

<?php>
$client = curl_init('https://dev.kelunik.com/css/all.min.css');
$log = fopen('/tmp/curl-log.txt', 'a+');

curl_setopt($client, CURLOPT_VERBOSE, 1);
curl_setopt($client, CURLOPT_STDERR, $log);
curl_setopt($client, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($client, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($client, CURLOPT_CAINFO, "/etc/ssl/certs/ssl-cert-snakeoil.pem");
curl_setopt($client, CURLOPT_FAILONERROR, false);
curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
curl_setopt($client, CURLOPT_HEADER, true);
curl_setopt($client, CURLINFO_HEADER_OUT, true);
curl_setopt($client, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($client, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($client, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

if (!$response = curl_exec($client)) {
    throw new CurlException('Making request failed: ' . curl_error($client) . '(' . curl_errno($client) . ')');
} else {
    echo "done!\n";
}

fclose($log);
?>


错误35是“未知ssl错误”。您没有从
curl\u error()
调用中得到任何更具体的消息?我只从中得到非常有用的错误:(您使用的是哪一版本的OpenSSL?能否添加
curl--version
?@JeremiahWinsley doneYes的输出?这是我的猜测。我们目前使用的是来自Mozilla的以下列表: