我正在使用Goutte使用SSL证书在Web服务器上获取页面。每当我尝试获取此页面时,都会抛出以下异常:
Uncaught exception 'Guzzle\\Http\\Exception\\CurlException' with message
'[curl] 35: error:1407742E:SSL
routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
[url] https://somesite.com
我一直在网上寻找这种类型的错误。当握手失败时,似乎会发生此错误。服务器似乎支持TLSv1,客户端使用SSL23。
我不确定此评估是否正确,也不知道如何纠正。
这是我目前正在使用的代码:
<?php
use Goutte\Client;
$client = new Client();
$guzzle = $client->getClient();
$guzzle->setConfig(
array(
'curl.CURLOPT_SSL_VERIFYHOST' => false,
'curl.CURLOPT_SSL_VERIFYPEER' => false,
)
);
$client->setClient($guzzle);
$crawler = $client->request('GET', 'https://somesite.com'); // IT FAILS HERE
更新
注意:我几周前开始收到类似的错误,所以我想我会更新问题和答案,因为它们是相关的。
我遇到了类似的错误:
[curl] 35: Unknown SSL protocol error in connection to website.com:443
答案 0 :(得分:2)
我在博文“Fixing SSL Handshake with PHP5 and Curl”
中找到了这个问题的答案在某些操作系统中可能会发生此错误,但并非所有操作系统都会发生此错误。我目前在我的开发环境中使用Ubuntu 12.04。
值得庆幸的是,这可以在代码级解决,如下所示:
use Goutte\Client;
$client = new Client();
$guzzle = new GuzzleClient('https://somesite.com', array(
'curl.options' => array(
'CURLOPT_SSLVERSION' => 'CURL_SSLVERSION_TLSv1',
)
));
$client->setClient($guzzle);
$crawler = $client->request('GET', 'https://somesite.com');
<强>更新强>
有关消息的解决方案
[curl] 35: Unknown SSL protocol error in connection to website.com:443
解决起来有点棘手,因为消息没有说明发生了什么。
This GitHub问题指出了我正确的方向。我可以使用多个版本的CURLOPT_SSLVERSION(当然!),但这些版本包括v1.0,v1.1和v1.2!有关详细信息,请参阅curl_setopt。
对于此特定错误,我最终使用以下代码:
$guzzle = new GuzzleClient('https://somesite.com', array(
'curl.options' => array(
'CURLOPT_SSLVERSION' => 'CURL_SSLVERSION_TLSv1_1',
)
));
我尝试连接的网站不接受任何其他选项,包括CURL_SSLVERSION_TLSv1
。