Nếu bạn đã từng thử kết nối với dịch vụ xóa hoặc máy chủ bằng SSL từ tập lệnh cURL hoặc PHP phía máy chủ đang chạy trên Windows Server, rất có thể bạn đã gặp phải tình trạng không thể xác minh chứng chỉ SSL của máy chủ từ xa
Sự cố xảy ra khi bạn đang cố liên hệ với một kết nối được bảo mật SSL/TLS [và đặt tùy chọn cuộn tròn
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
2 thành đúng]Lỗi trông như thế này
error:14090086
SSL routines:SSL3_GET_SERVER_CERTIFICATE
certificate verify failed
hoặc đơn giản có thể trả về lỗi
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
3Vâng, vấn đề có một giải pháp rất đơn giản. CURL không thể nói chuyện trực tiếp với kho lưu trữ chứng chỉ Windows, vì vậy bạn phải cung cấp cho nó một tệp để xác thực Cơ quan cấp chứng chỉ gốc đáng tin cậy đối với
Giải pháp
Có một số tùy chọn để lấy gói chứng chỉ CA
- Tải xuống một cái [không hoàn toàn được khuyến nghị nhưng đây là tùy chọn dễ dàng nhất];
- Xuất khẩu từ một nhà cung cấp đáng tin cậy [e. g. Mozilla];
- Xuất từ cửa hàng Windows CA của bạn;
Tải xuống từ mạng
Để tải xuống tệp pem hiện tại, hãy truy cập vào đây.
http. //Xoăn. haxx. se/docs/caextract. html
và tải xuống tệp
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
4. [http. //Xoăn. haxx. se/ca/cacert. pem]không phải là bạn nên tin tưởng vào bất kỳ nguồn nào trên internet để đảm bảo tính hợp lệ của các gói CA này hoặc tính bảo mật của máy chủ của bạn, nhưng tôi đã xác minh [ít nhất một lần] rằng tệp này là .
Tuy nhiên, nếu bạn không muốn tin tưởng một số trang web ngẫu nhiên từ tệp, bạn có thể
Lấy danh sách Mozilla
Tập lệnh chuyển đổi mk-ca-bundleCông cụ mk-ca-bundle chuyển đổi gói chứng chỉ của Mozilla sang định dạng PEM, phù hợp với [lib]curl và những thứ khác. Viết bởi Guenter Knauf
Bạn cũng có thể trích xuất danh sách chứng chỉ CA từ cài đặt Firefox cục bộ của mình, nếu bạn đã cài đặt công cụ certutil. Bạn chỉ cần chạy firefox-db2pem. sh [vâng, đây là tập lệnh BASH, vì vậy bạn cần phải là Linux để chạy tập lệnh này]
Xuất từ Windows
Thực hiện theo các bước sau để xuất chứng chỉ CA của Tổ chức phát hành chứng chỉ gốc đáng tin cậy của bạn
- Từ menu bắt đầu của windows, hãy chạy lệnh "mmc. exe" để khởi chạy Bảng điều khiển quản lý Microsoft;
- Từ MMC, chọn "Tệp"? . " từ menu chính;
- Thêm phần đính kèm Chứng chỉ;
- Từ thư mục gốc của bảng điều khiển, điều hướng đến "Chứng chỉ [Máy tính cục bộ]" > "Cơ quan chứng nhận gốc đáng tin cậy" > "Chứng chỉ";
- Chọn tất cả các chứng chỉ [
5+curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
6] và chọn "Hành động" > "Tất cả tác vụ" > "Xuất. " từ menu chính của MMC;curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
- Làm theo hướng dẫn để xuất [các] chứng chỉ sang Tiêu chuẩn cú pháp thông báo mật mã - PKCS#7 [. pb7] vào một tệp có tên là
7;curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
- Mở dấu nhắc lệnh [
8] và điều hướng đến thư mục chứa tệp PB7 mà bạn vừa tạo;curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
- Chạy openSSL. exe [bạn có thể cần thêm đường dẫn đến chương trình này vào biến môi trường PATH của Windows] để chuyển đổi tệp thành văn bản bằng lệnh sau.
______19
Sau đó, trong ứng dụng PHP của bạn chẳng hạn, hãy thêm dòng sau TRƯỚC KHI bạn gọi
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
0curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
Nếu bạn đang sử dụng cURL, chỉ cần đổi tên tệp thành
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
1 và đặt tệp đó vào cùng thư mục với tệp curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
2 của bạn và tệp sẽ tự động phát hiện tệp đóĐó là tất cả những gì bạn cần để bắt đầu mọi thứ
Hãy nhớ rằng, bạn không nhất thiết phải xuất tất cả CA. Trong trường hợp của Yubikey, máy chủ API xác thực sử dụng chứng chỉ do GoDaddy cấp, vì vậy bạn chỉ cần xuất một lần nếu không muốn phải cập nhật tệp này mỗi khi các nhà cung cấp khác nhau cập nhật chứng chỉ ROOT CA
Từ PHP, bạn có thể truy cập Thư viện cURL hữu ích [libcurl] để tạo yêu cầu tới các URL bằng nhiều giao thức như HTTP, FTP, LDAP và thậm chí cả Gopher. [Nếu bạn đã dành thời gian cho dòng lệnh *nix, hầu hết các môi trường cũng có sẵn lệnh
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
0 sử dụng thư viện libcurl]Tuy nhiên, trên thực tế, giao thức được sử dụng phổ biến nhất có xu hướng là HTTP, đặc biệt khi sử dụng PHP để liên lạc giữa máy chủ với máy chủ. Thông thường, điều này liên quan đến việc truy cập một máy chủ web khác như một phần của cuộc gọi dịch vụ web, sử dụng một số phương thức như XML-RPC hoặc REST để truy vấn tài nguyên. Ví dụ: Delicious cung cấp API dựa trên HTTP để thao tác và đọc bài đăng của người dùng. Tuy nhiên, khi cố gắng truy cập tài nguyên HTTPS [chẳng hạn như API ngon], bạn phải thực hiện thêm một chút cấu hình trước khi có thể khiến cURL hoạt động ngay trong PHP
Vấn đề
Nếu bạn chỉ cố truy cập HTTPS [tài nguyên được bảo vệ bằng SSL hoặc TLS] trong PHP bằng cURL, bạn có thể gặp một số khó khăn. Giả sử bạn có đoạn mã sau. [Xử lý lỗi bị bỏ qua cho ngắn gọn]
// Initialize session and set URL.
$ch = curl_init[];
curl_setopt[$ch, CURLOPT_URL, $url];
// Set so curl_exec returns the result instead of outputting it.
curl_setopt[$ch, CURLOPT_RETURNTRANSFER, true];
// Get the response and close the channel.
$response = curl_exec[$ch];
curl_close[$ch];
Nếu
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
1 trỏ tới một tài nguyên HTTPS, bạn có thể gặp lỗi như bên dướiFailed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Vấn đề là cURL chưa được định cấu hình để tin cậy chứng chỉ HTTPS của máy chủ. Các khái niệm về chứng chỉ và PKI xoay quanh sự tin cậy của Tổ chức phát hành chứng chỉ [CA] và theo mặc định, cURL được thiết lập để không tin cậy bất kỳ CA nào, do đó, nó sẽ không tin tưởng bất kỳ chứng chỉ nào của máy chủ web. Vậy tại sao bạn không gặp sự cố khi truy cập các trang web HTTP thông qua trình duyệt web của mình?
cách khắc phục nhanh
Có hai cách để giải quyết vấn đề này. Đầu tiên, chúng tôi chỉ cần định cấu hình cURL để chấp nhận bất kỳ chứng chỉ máy chủ [ngang hàng] nào. Điều này không phải là tối ưu từ quan điểm bảo mật, nhưng nếu bạn không chuyển thông tin nhạy cảm qua lại, điều này có thể ổn. Chỉ cần thêm dòng sau trước khi gọi
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
2curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, false];
Về cơ bản, điều này khiến cURL chấp nhận một cách mù quáng bất kỳ chứng chỉ máy chủ nào mà không thực hiện bất kỳ xác minh nào về việc CA nào đã ký chứng chỉ đó và liệu CA đó có đáng tin cậy hay không. Nếu bạn hoàn toàn lo lắng về dữ liệu bạn đang chuyển đến hoặc nhận từ máy chủ, bạn sẽ muốn kích hoạt xác minh ngang hàng này đúng cách. Làm như vậy phức tạp hơn một chút
sửa chữa thích hợp
Cách khắc phục thích hợp liên quan đến việc đặt tham số
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
3. Điều này được sử dụng để trỏ tới chứng chỉ CA mà cURL nên tin tưởng. Do đó, mọi chứng chỉ máy chủ/ngang hàng do CA này cấp cũng sẽ được tin cậy. Để làm được điều này, trước tiên chúng ta cần lấy chứng chỉ CA. Trong ví dụ này, tôi sẽ sử dụng https. //api. xóa. cio. chúng tôi/máy chủ làm tài liệu tham khảoTrước tiên, bạn cần truy cập URL bằng trình duyệt web của mình để lấy chứng chỉ CA. Sau đó, [trong Firefox] mở chi tiết bảo mật cho trang web bằng cách nhấp đúp vào biểu tượng ổ khóa ở góc dưới bên phải
Sau đó nhấp vào “Xem chứng chỉ”
Mở tab “Chi tiết” của trang chứng chỉ và chọn chứng chỉ ở đầu phân cấp. Đây là chứng chỉ CA
Sau đó nhấp vào "Xuất" và lưu chứng chỉ CA vào vị trí bạn đã chọn, đảm bảo chọn X. 509 Chứng chỉ [PEM] làm loại/định dạng lưu
Bây giờ, chúng tôi cần sửa đổi thiết lập cURL để sử dụng chứng chỉ CA này, với __
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
3 được đặt để trỏ đến nơi chúng tôi đã lưu tệp chứng chỉ CA vào________số 8Tùy chọn khác mà tôi đã đưa vào, có thể đặt
curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
5 thành các giá trị số nguyên sau- 0. Không kiểm tra thuộc tính tên chung [CN]
- 1. Kiểm tra xem thuộc tính tên chung ít nhất có tồn tại không
- 2. Kiểm tra xem tên chung có tồn tại không và nó có khớp với tên máy chủ của máy chủ không
Nếu bạn đặt
Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
0 thành false, thì từ góc độ bảo mật, việc bạn đặt curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
5 thành gì không thực sự quan trọng, vì nếu không có xác minh chứng chỉ ngang hàng, máy chủ có thể sử dụng bất kỳ chứng chỉ nào, kể cả chứng chỉ tự ký đã được đảm bảo . Vì vậy, cài đặt này thực sự chỉ phù hợp nếu bạn đã bật xác minh chứng chỉĐiều này đảm bảo rằng không chỉ bất kỳ chứng chỉ máy chủ nào sẽ được phiên cURL của bạn tin cậy. Ví dụ: nếu kẻ tấn công bằng cách nào đó chuyển hướng lưu lượng truy cập từ api. ngon. com đến máy chủ của họ, phiên cURL ở đây sẽ không được khởi chạy đúng cách, vì kẻ tấn công sẽ không có quyền truy cập vào chứng chỉ máy chủ [i. e. sẽ không có khóa riêng] được CA tin cậy mà chúng tôi đã thêm. Các bước này xuất hiệu quả CA đáng tin cậy từ trình duyệt web sang cấu hình cURL
Thêm thông tin
Nếu bạn có chứng chỉ CA, nhưng nó không ở định dạng PEM [i. e. nó ở định dạng nhị phân hoặc DER không được mã hóa Base64], bạn sẽ cần sử dụng thứ gì đó như OpenSSL để chuyển đổi nó sang định dạng PEM. Lệnh chính xác khác nhau tùy thuộc vào việc bạn đang chuyển đổi từ định dạng PKCS12 hay DER
Có một tùy chọn
Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
2 cho phép bạn chỉ định một thư mục chứa nhiều chứng chỉ CA để tin cậy. Nhưng nó không đơn giản như bỏ mọi chứng chỉ CA trong thư mục này. Thay vào đó, các chứng chỉ CA này phải được đặt tên chính xác và tiện ích OpenSSL Failed: Error Number: 60. Reason: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
3 có thể được sử dụng để thiết lập đúng thư mục này để cURL sử dụng