[PHP] Lỗi Cetificate của Curl trong PHP
Chả là hôm rồi có sử dụng thư viện curl
của PHP để gọi dịch vụ Restful Service của bên thứ 3 từ server PHP của mình thì gặp chút rắc rối nên giờ viết lại cho khỏi quên.
Cụ thể là khi chạy lệnh curl của PHP ăn ngay cái lỗi “SSL certificate problem: unable to get local issuer certificate” nên phải loay xoay xử lý tí.
Chắc mọi người cũng biết lệnh curl
của linux là một lệnh khá mạnh mẽ dùng để kết nối, gửi hay lấy dữ liệu với một máy chủ nào đó, và nó hỗ trợ nhiều kiểu giao thức khác nhau như HTTP
, HTTPS
, FTP
, GOPHER
, DICT
, TELNET
, LDAP
hay FILE
. Với ngôn ngữ PHP
lệnh này chính thức được hỗ trợ từ phiên bản PHP 4.0.2
. Với việc hỗ trợ này, ta có thể dễ dàng biến máy chủ của ta thành một máy client để gọi dịch vụ từ các máy chủ khác một cách dễ dàng hơn.
Trong bài viết này mình sử dụng hệ điều hành Windows, có cài git bash
và PHP 5. Khi nào test trên các môi trường khác thì mình sẽ cập nhập tiếp. Mình cũng sẵn sàng đón nhận sự góp ý của các bạn để bài này được hoàn thiện hơn.
Về cơ bản, sử dụng thư viện curl
không có gì khó khăn, nhưng nếu không biết thì debug khá là mệt. Để debug với curl
thì mình sử dụng cách log lại thực thi lệnh này với file log. Ví dụ như đoạn mã sau:
1 |
|
Sau khi thực hiện đoạn mã trên mình thấy chương trình luôn trả về lỗi là 60
và mình để ý file log có đoạn lỗi sau:
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
Ngồi tra tẹo thì cần phải cấu hình định danh được máy khách cho lệnh curl
thông qua thông tin curl.cainfo
ở file php.ini
. Trường hợp của mình sử dụng git bash
cài sẵn vào Windows nên mình sử dụng luôn file certificate này của git bash
. File này là C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt
, nên mình cần thêm đoạn mã sau vào file php.ini
.
curl.cainfo="C:\Program Files (x86)\Git\bin\curl-ca-bundle.crt"
Với các trường hợp khác ta cũng có thể làm tương tự, miễn sao máy có cài lệnh curl
là có thể tìm được đường dẫn tới file định danh này.