2012-10-17 11 views
17

Tôi đang cố gắng sử dụng cURL để đăng lên API chỉ mới bắt đầu sử dụng SNI (để chúng có thể lưu trữ nhiều chứng chỉ ssl trên 1 địa chỉ IP).Sử dụng cURL với SNI (Chỉ dẫn tên máy chủ)

CURL của tôi ngừng hoạt động do di chuyển này sang SNI. Họ giải thích rằng đó là vì cURL đang nhận lại * .domain-a.com thay vì * .domain-b.com nên SSL không thành công.

Điều này có vẻ là một lỗi trong cURL vì URL API không có lỗi khi được truy cập từ trình duyệt.

Sử dụng mã này, nó làm việc:

exec('curl -k -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

Tuy nhiên, sử dụng -k là xấu bởi vì nó không xác minh cert SSL.

Sử dụng mã này, không làm việc:

exec('curl -d "parameters=here", https://urlhere.com/', $output); 
print_r($output); 

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể sử dụng curl với SNI và vẫn kiểm tra SSL (không phải sử dụng -k). Có một thiết lập trong PHP hoặc một tùy chọn cURL tôi có thể thiết lập để làm việc xung quanh này?

Trả lời

44

Để có thể sử dụng SNI, ba điều kiện được yêu cầu:

  • Sử dụng một phiên bản của Curl hỗ trợ nó, ít nhất là 7.18.1, theo change logs.
  • Sử dụng phiên bản Curl được biên soạn dựa vào thư viện hỗ trợ SNI, ví dụ: OpenSSL 0.9.8j (tùy thuộc vào các tùy chọn biên dịch một số phiên bản cũ hơn).
  • Sử dụng TLS 1.0 ít nhất (không phải SSLv3).

Lưu ý rằng mã debug Curl của (-v) chỉ hiển thị số phiên bản chính (chủ yếu để phân biệt giữa SSLv2 và SSLv3 loại + các thông điệp, xem ssl_tls_trace), do đó nó vẫn sẽ hiển thị "SSLv3" khi bạn sử dụng TLS 1.0 hoặc ở trên (vì chúng có hiệu quả SSL v3.1 trở lên, 3 là cùng số phiên bản chính).

Bạn có thể kiểm tra xem phiên bản curl đã cài đặt của bạn có thể sử dụng SNI bằng Wireshark hay không. Nếu bạn tạo kết nối bằng cách sử dụng curl -1 https://something, nếu bạn mở rộng thông báo "Chào mừng khách hàng", bạn sẽ có thể thấy tiện ích mở rộng "server_name".

Tôi không chắc chắn mà SSL/TLS phiên bản được sử dụng bởi mặc định (tùy thuộc vào tùy chọn biên dịch của bạn) khi bạn sử dụng mà không cần curl-1 (đối với TLS 1.0) hoặc -3 (đối với SSLv3), nhưng bạn có thể cố gắng ép buộc -1 trên lệnh của bạn, vì nó sẽ không hoạt động với SSLv3.

+0

Nếu bạn muốn sử dụng libcurl, hãy đặt 'CURLOPT_SSLVERSION' thành' 1' (tương đương với '-1' trên dòng lệnh). – Bruno

+0

Đối với tôi, nó đã cài đặt phiên bản cũ của cURL. Cập nhật nó đã sửa nó. – Justin

+3

BTW là một ví dụ tuyệt vời về câu trả lời hay về SO. Cảm ơn –