2016-01-14 149 views
1

我有以下代碼:捲曲PHP握手失敗SSL

<?php 
$cookie_file_path = "cookie.txt"; // 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'theurl'); 
curl_setopt($ch, CURLOPT_POSTFIELDS,'blocPnr_textField_labelNom='.urlencode('www').'&blocPnr_textField_labelPnr='.urlencode('xxx').'&blocPnr_valider=Submit'); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_SSLVERSION,3); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"); 
curl_setopt($ch, CURLOPT_REFERER, "theurl"); 
$page = curl_exec($ch); 
var_dump($page); 
echo 'error:' . curl_error($ch); 
?> 

它給了我下面的錯誤:

bool(false) error:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

我無法揣摩出鉛的來源。我在Google和S/O上尋找類似的錯誤消息,但沒有找到任何解決方案。

+1

你確定它是'sslv3'嗎? – Alex

+0

我怎麼知道?和我可以嘗試的不同版本是什麼?我看着這個(http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html),但不知道我明白要鍵入什麼 – justberare

+1

這是一個'CURL_SSLVERSION_TLSv1'來代替它。 – Alex

回答

1

您正在嘗試使用服務器拒絕或不支持的SSL協議版本3。 The POODLE attack推動了很多系統管理員放棄對SSLv3的支持,並且它的使用不再那麼普遍(並且絕對不推薦)。

當你有SSL握手錯誤時,try different versions of SSL/TLS直到有效(最好是最安全的)。如果您有疑問,在大多數情況下使用CURL_SSLVERSION_DEFAULT

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_DEFAULT); 

似乎formulaire.sncf.com支持TLSv1.0。你也可以強制使用該協議版本:

curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_0); 
+1

否 - 首先刪除CURLOPT_SSLVERSION,看看自動協商是否工作(這應該)。如果您有特定的需要,您應該只限制SSLVERSION。 – symcbean