2013-02-25 19 views
11

file_get_contents với máy chủ https hoạt động tốt, ngoại trừ một máy chủ cụ thể (kiểm tra máy chủ api từ một số công ty - danh sách trắng ip, không thể cung cấp cho bạn URL để kiểm tra). Quy tắc này không được tải https mô-đun và các lỗi thiết lập ban đầu khác.file_get_contents bỏ qua verify_peer => false?

Tôi đã thử nghiệm với nhiều cài đặt PHP, tất cả ở v5.3.3, 32 bit, 32 bit Debian.

Yêu cầu hoạt động với cURL, nhưng chỉ khi đặt curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);. Tuy nhiên, thiết lập verify_peer"=>false trên ngữ cảnh cho file_get_contents dường như không tạo ra sự khác biệt nào.

Với đào tạo Quản lý, cùng yêu cầu chính xác (giống URL, cùng một dữ liệu POST XML) không thành công với SSL: Kết nối reset by peer:

$arrContextOptions=array(
    "http" => array(
     "method" => "POST", 
     "header" => 
      "Content-Type: application/xml; charset=utf-8;\r\n". 
      "Connection: close\r\n", 
     "ignore_errors" => true, 
     "timeout" => (float)30.0, 
     "content" => $strRequestXML, 
    ), 
    "ssl"=>array(
     "allow_self_signed"=>true, 
     "verify_peer"=>false, 
    ), 
); 

file_get_contents("https://somedomain:2000/abc/", false, stream_context_create($arrContextOptions)); 

.

Có ai gặp phải điều này với tệp_get_contents không? Bất kỳ ý tưởng nào về cách gỡ lỗi?

+0

Bạn thử thiết lập 'allow_self_signed' false? – Repox

+0

Chỉ cần thử nó, cùng một lỗi. –

+4

Tại sao không chỉ sử dụng cURL? –

Trả lời

0

thử mã này:

$fp = fsockopen("ssl://somedomain/abc/", 2000 , $ErrNo, $ErrString, 30); 
if (!$fp) { 
    echo "Error No : $ErrNo - $ErrString <br />\n"; 
} else { 
    $out = "POST/HTTP/1.1\r\n"; 
    $out .= "Host: somedomain \r\n"; 
    $out .= "Content-Type: application/xml; charset=utf-8;\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
} 

nếu bạn không nhận được lỗi, tôi nghĩ rằng vấn đề (với đào tạo Quản lý) được cấu hình php dạng khách hàng khác từ cấu hình máy chủ.

+0

Ok, fsockopen đã hoạt động. Tuy nhiên, không có gì sai với cấu hình PHP. Nó hoạt động tốt với nhiều chứng chỉ SSL tự ký HTTPS khác. –

0

Bạn có thể thử gỡ lỗi này bằng Wireshark - bạn có thể có ý tưởng tốt hơn về những gì xảy ra, bạn sẽ thấy lỗi SSL nào xảy ra.

+0

Máy chủ SSL báo cáo lỗi SSL trước khi treo lên? –

+0

Bạn đang nhận được "Kết nối được thiết lập lại bởi peer", có nghĩa là nó không cần thiết treo lên. Tôi đoán nếu máy khách và máy chủ không thể đồng ý về phiên bản bắt tay SSL nào sẽ sử dụng, bạn sẽ gặp phải lỗi này. – JackTheRandom

1

không biết liệu điều này có thực sự hữu ích hay không, nhưng hãy thử xóa các tùy chọn SSL khỏi mảng tùy chọn của bạn.

Lý do đằng sau điều này: theo http://www.php.net/manual/en/context.ssl.php, verify_peerfalse theo mặc định.

allow_self_signed YÊU CẦU verify_peer và theo mặc định là false.

Từ phía trên, tôi thu thập rằng allow_self_signed có thể ghi đè cài đặt của bạn cho verify_peer.

Vì vậy, hãy thử mà không có bất kỳ tùy chọn nào cho SSL hoặc không có allow_self_signed và cho chúng tôi biết nếu điều đó đã giúp ích gì.

-1

chỉ cài đặt này

yum install ca-certificates.noarch 
+1

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Ngoài ra, hãy cố gắng không gắn mã của bạn với các nhận xét giải thích vì điều này làm giảm khả năng đọc của cả mã và giải thích! – FrankerZ