2009-04-08 43 views
21

Tôi đang cố gắng viết tập lệnh PHP bằng cURL có thể ủy quyền cho người dùng thông qua trang sử dụng chứng chỉ SSL, ngoài tên người dùng và mật khẩu và tôi dường như không thể qua giai đoạn SSL cert.Lỗi khi sử dụng PHP cURL với chứng chỉ SSL

Trong trường hợp này, không may là curl_setopt($handle, CURLOPT_VERIFYPEER, 0). Chứng chỉ là phần xác thực bắt buộc, nếu không tôi sẽ gặp lỗi được đề cập trong this other similar SO post.

Tôi đã thử một vài dòng lệnh chạy với cURL:

> curl --url https://website

này trả về lỗi (60) SLL certificate problem. Nếu tôi điều chỉnh lệnh để bao gồm các tùy chọn --cacert:

> curl --url https://website --cacert /path/to/servercert.cer

Nó hoạt động tốt; trang web auth được trả về.

Tuy nhiên, tôi đã thử các mã PHP sau:

$handle = curl_init(); 
$options = array( 
        CURLOPT_RETURNTRANSFER => false, 
        CURLOPT_HEADER   => true, 
        CURLOPT_FOLLOWLOCATION => false, 
        CURLOPT_SSL_VERIFYHOST => '0', 
        CURLOPT_SSL_VERIFYPEER => '1', 
        CURLOPT_CAINFO   => '/path/to/servercert.cer', 
        CURLOPT_USERAGENT  => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)', 
        CURLOPT_VERBOSE  => true, 
        CURLOPT_URL   => 'https://website' 
      ); 

curl_setopt_array($handle, $options); 
curl_exec($handle); 
if (curl_errno($handle)) { 
    echo 'Error: ' . curl_error($handle); 
} 
curl_close($handle); 

Tôi đã có thể nghĩ mã là về cơ bản tương tự như các lệnh shell, nhưng thay vào đó tôi đang chào đón với thông báo lỗi sau:

Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none

Tôi đã đọc tất cả các tài liệu tôi có thể tìm thấy (đặc biệt là trên php.net và curl.haxx) và dường như không tìm thấy bất kỳ điều gì khắc phục sự cố này. Bất kỳ đề xuất?

EDIT: Tôi đã thử chmod 777 servercert.cer không thành công. Tuy nhiên, khi thực thi kịch bản PHP với mã trên từ dòng lệnh thay vì trình duyệt qua php test.php, nó hoạt động hoàn hảo. Bất kỳ giải thích cho lý do tại sao nó không hoạt động trong trình duyệt?

CHỈNH SỬA 2: Những ổ đĩa này chỉ dành cho những linh hồn duy nhất đủ can đảm để trả lời câu hỏi này đang cũ. Hoặc là đóng góp một cái gì đó có ý nghĩa hoặc đi qua bởi, xin vui lòng.

+0

PHP chắc chắn có quyền đọc tệp đó không? Thử chạy tập lệnh từ dòng lệnh: php my.php – Greg

+0

Lạ! Tôi đã thử nghiệm nó như bạn đã nói, và nó hoạt động hoàn hảo! Tại sao nó hoạt động từ dòng lệnh, nhưng không hoạt động trên trình duyệt? – Magsol

+0

http://serverfault.com/questions/121768/curl-or-ssl-problems-how-to-solve/297484#297484 –

Trả lời

11

Bởi vì mọi thứ hoạt động thông qua dòng lệnh nhưng không thông qua php bằng cách sử dụng curl thì tôi sẽ theo đuổi curl là vấn đề.

Theo URL này, http://curl.haxx.se/docs/sslcerts.html, đó là tài liệu tham khảo trong một SO gửi bạn trích dẫn ở trên (reading SSL page with CURL (php)) ...

"Cho đến 7.18.0, curl kèm một lỗi thời nặng nề tập tin ca bó đã được cài đặt bởi Mặc định, những ngày này, các kho lưu trữ curl bao gồm không có certs ca tại tất cả. Bạn cần phải lấy chúng ở nơi khác, ví dụ:

Nếu máy chủ từ xa sử dụng chứng chỉ tự ký, nếu bạn không cài đặt CA gói chứng chỉ, nếu máy chủ sử dụng chứng chỉ được ký bởi CA không phải là i ncluded trong gói bạn sử dụng hoặc nếu máy chủ từ xa là kẻ mạo danh mạo danh trang web yêu thích của bạn và bạn muốn chuyển tệp từ máy chủ này, hãy thực hiện một trong các thao tác sau: "

Sau đó, hãy vào danh sách một số các bước mà bạn có thể thử.

Vì phiên bản 7.16.0 của bạn là trước 7.18.0, nếu bạn chưa có, tôi khuyên bạn nên cập nhật các thành phần curl và openssl của bạn và sau đó làm việc thông qua danh sách được tham chiếu ở trên.

3

Bây giờ, câu hỏi này là cũ, nhưng có thể có ích cho một số người dùng đang tìm câu trả lời hiện tại.

Tôi có vấn đề tương tự về API với SSL, gặp sự cố với CURL (không phải với trình duyệt), vấn đề của tôi là tôi chỉ đặt chứng chỉ chứ không phải chuỗi/chuỗi ceritifcates. Sau đó, tôi đặt nó và mọi thứ bắt đầu hoạt động. Vì vậy, đó là quan trọng để tránh các vấn đề.

Hy vọng điều này có thể hữu ích cho ai đó.

5

Sau 6 năm câu hỏi, tôi gặp vấn đề tương tự trên máy chủ chia sẻ và dường như không có câu trả lời thỏa đáng. Tôi tìm thấy cho mình một giải pháp, hy vọng nó hữu ích cho tất cả mọi người.

Bạn có thể thử cấu hình này:

curl_setopt($config,CURLOPT_SSL_VERIFYHOST,0); 
curl_setopt($config,CURLOPT_SSL_VERIFYPEER,1); 
curl_setopt($config,CURLOPT_CAINFO,'ca-bundle.crt'); 
curl_setopt($config,CURLOPT_CAPATH,'ca-bundle.crt'); 

tôi gặp lỗi tương tự với @Magsol: Error: error setting certificate verify locations: CAfile: /path/to/servercert.cer CApath: none; vì vậy tôi đã thêm dòng thứ 4 để đặt CAPath.

Nó hoạt động với tôi. Nhưng lưu ý, các tập tin CA phải được đặt trong dir truy cập (với chmod 755 hoặc 777) và nó sẽ tốt hơn nếu tập tin CA là trong cùng một thư mục với tập tin PHP.

+0

Điều này đã làm việc, ** chỉ khi tôi đặt đường dẫn là đường dẫn tuyệt đối ** ... nếu bạn có 'ca-bundle.crt' trong cùng thư mục với tệp PHP đang gọi, điều đó có nghĩa là đường dẫn sẽ thực sự là' __DIR __. '/ ca-bundle.crt'' –

0

Để xây dựng và tổng hợp này lên:

nếu bạn có một tập tin PHP sử dụng PHP curl và đặt chứng chỉ ca cho hệ thống của bạn trong cùng thư mục, mã dưới đây sẽ cung cấp cho bạn một Jumpstart

$url = "https://myserver.mydomain.local/get_somedata.php"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 

//These next lines are for the magic "good cert confirmation" 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_VERBOSE, true); 

//for local domains: 
//you need to get the pem cert file for the root ca or intermediate CA that you signed all the domain certificates with so that PHP curl can use it...sorry batteries not included 
//place the pem or crt ca certificate file in the same directory as the php file for this code to work 
    curl_setopt($ch, CURLOPT_CAINFO, __DIR__.'/cafile.pem'); 
    curl_setopt($ch, CURLOPT_CAPATH, __DIR__.'/cafile.pem'); 

//DEBUG: remove slashes on the next line to prove "SSL verify" is the cause  
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

//Error handling and return result 
    if (curl_exec($ch) === false) 
     { 
     $result = curl_error($ch); 
     } 
    else 
     { 
     $result = curl_exec($ch); 
     } 
    // Close handle 
    curl_close($ch); 
    return $result; 
+0

oops nếu câu lệnh ở cuối kéo gọi gấp đôi ... xấu của tôi, điều chỉnh như vậy –

+0

$ data = curl_exec ($ ch); nếu ($ data === false) { $ result = curl_error ($ ch); } else { $ result = $ data; } –

Các vấn đề liên quan