2012-03-19 37 views
9

Tôi đã gặp sự cố trên máy chủ phát triển của mình, nơi cURL, trong khi hoạt động hoàn hảo với bất kỳ HTTP nào, không hoạt động đúng với bất kỳ HTTPS nào — ngay cả tài nguyên chính xác với các giao thức khác nhau (để thử nghiệm tôi ' đã yêu cầu google.com sử dụng cả http và https).PHP cURL Không hoạt động với HTTPS

Lỗi cURL được trả lại là 35: "Sự cố xảy ra ở đâu đó trong quá trình bắt tay SSL/TLS".

Tôi đã chải web và SO cho các giải pháp, và tất cả chúng đã được đặt CURLOPT_SSL_VERIFYPEER thành false, không thay đổi gì hoặc tải xuống tệp chứng chỉ và đặt CURLOPT_CAINFO thành đường dẫn của nó, cũng không thay đổi gì.

Khi đặt chứng chỉ, tôi làm theo hướng dẫn của this tutorialthis tutorial, cố tải xuống chứng chỉ cho tài nguyên mà tôi đang yêu cầu và tải xuống gói chứng chỉ.

Tôi cũng đã cố gắng đặt CURLOP_PORT thành 443 một cách rõ ràng. Để có được câu hỏi của tôi, các tùy chọn khác tôi đặt là CURLOPT_VERBOSE = true, CURLOPT_RETURNTRANSFER = true và CURLOPT_SSL_VERIFYHOST = 2 (Tôi đã thử mọi kết hợp 1 và 2 với VERIFYPEER cả đúng và sai). Tôi cũng đã chắc chắn rằng trong phpinfo() rằng tôi có OpenSSL và nó được kích hoạt.

Tôi đang sử dụng rất nhiều mã cũ hoạt động hoàn hảo trên máy chủ sản xuất cuối cùng của mình, vì vậy mã này đã hoạt động trước đó. Nhưng lưu trữ đó được chia sẻ lưu trữ và tôi không biết hầu hết cấu hình ở đó.

+0

Bạn có đang truy cập cùng một URL không? Bạn đã đạt được hầu hết các nghiên cứu tương tự mà tôi đã làm khi tôi gặp phải vấn đề này. – Jason

+0

Tôi đã sử dụng cả http: // www.google.com, đã hoạt động; và https: // www.google.com, không. – spezied

+0

@Spezied, nếu câu trả lời được cung cấp trả lời câu hỏi của bạn, bạn có thể vui lòng chọn câu trả lời cho câu trả lời của mình để câu hỏi có thể bị đóng không? Cám ơn. –

Trả lời

8

Làm thế nào về điều này. Nó tìm kiếm trang chủ HTTPS của Google cho tôi. Nó nên làm các trick cho bạn.

<?PHP 

// connect via SSL, but don't check cert 
$handle=curl_init('https://www.google.com'); 
curl_setopt($handle, CURLOPT_VERBOSE, true); 
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); 
$content = curl_exec($handle); 

echo $content; // show target page 
?> 
+1

Xem câu trả lời của tôi ở trên, bỏ qua cert's không phải là lựa chọn tốt nhất. – Ray

+3

NÀY KHÔNG CHẤP NHẬN. Đừng làm điều này. Luôn xác minh đồng đẳng và máy chủ lưu trữ. Xem câu trả lời khác. –

+5

@Matt. Phụ thuộc vào những gì bạn đang làm. Di chuyển nội dung quan trọng cho tài chính, chắc chắn xác thực HTTPS. Cạo các nhãn hiệu giày từ một trang web bán lẻ ... MITM không phải là một vấn đề. Rõ ràng xem xét bối cảnh vấn đề. –

16

Curl không có chứng chỉ gốc tích hợp (như trình duyệt hiện đại nhất). Bạn cần trỏ rõ ràng tệp đó đến tệp cacert.pem:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cert/file/cacert.pem'); 

Nếu không, curl này không thể xác minh chứng chỉ được gửi lại qua ssl. Có thể sử dụng cùng một tệp chứng chỉ gốc này mỗi khi bạn sử dụng SSL trong curl.

Bạn có thể nhận được các tập tin CAcert.pem đây: http://curl.haxx.se/docs/caextract.html

+0

Tại sao không chỉ sử dụng tương đương với cờ '--insecure'? Có cái nào không? – Pacerier

+1

@Pacerier cài đặt 'CURLOPT_SSL_VERIFYPEER' thành false là cờ' --insecure' chính xác trên dòng lệnh. Bạn không muốn làm một trong hai nếu bạn quan tâm về tính xác thực của máy chủ đích của bạn – Ray

+0

nó không hoạt động. Trong khi 'CURLOPT_SSL_VERIFYPEER' thành' false'. – n8bar

2

Tìm nếu hệ điều hành của bạn bao gồm một thư mục của giấy chứng nhận. Nếu vậy thì các chứng chỉ CA bắt buộc sẽ thường được đưa vào. Trên Ubuntu, ví dụ, thường là /etc/ssl/certs. Nếu thư mục này tồn tại, hãy đặt thông số đường dẫn CA:

curl_setopt($ch, CURLOPT_CAPATH, '/etc/ssl/certs'); 

Hoặc bạn có thể tham chiếu tệp chứng chỉ CA duy nhất. Bao gồm tệp cacert.pem trong dự án của bạn hoặc cài đặt nó trên máy chủ của bạn. Tải xuống từ một nguồn đáng tin cậy, ví dụ: cacert.org. Đối với một tập tin duy nhất không đặt các CAPATH và thay vào đó chỉ đặt CAINFO:

curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'); 

Tắt xác minh đồng đẳng và chủ nhà là một cách nhanh chóng nhưng không an toàn workaround cho vấn đề thực sự. Những tính năng này tồn tại vì lý do chính đáng: vì vậy bạn có thể tin tưởng, thông qua bên thứ ba, rằng hệ thống bạn đang kết nối là hệ thống bạn mong đợi.

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
Các vấn đề liên quan