Cách đặt chứng chỉ ssl trong curl php?

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']
3

Vâ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-bundle

Cô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

Chuyển đổi từ cài đặt Firefox cục bộ của bạn [linux]

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

  1. 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;
  2. Từ MMC, chọn "Tệp"? . " từ menu chính;
  3. Thêm phần đính kèm Chứng chỉ;
  4. 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ỉ";
  5. Chọn tất cả các chứng chỉ [
    curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
    
    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;
  6. 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à
    curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
    
    7;
  7. Mở dấu nhắc lệnh [
    curl_setopt [$ch, CURLOPT_CAINFO, 'C:\PHP\extras\openssl\TrustedRootCAs.certs']
    
    8] và điều hướng đến thư mục chứa tệp PB7 mà bạn vừa tạo;
  8. 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']
0

curl_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ưới

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

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']
2

curl_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ảo

Trướ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ố 8

Tù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

Curl có kiểm tra chứng chỉ SSL không?

curl thực hiện xác thực chứng chỉ SSL ngang hàng theo mặc định . Điều này được thực hiện bằng cách sử dụng kho lưu trữ chứng chỉ mà thư viện SSL có thể sử dụng để đảm bảo chứng chỉ máy chủ của máy ngang hàng hợp lệ.

Curl có sử dụng SSL không?

Curl sẽ tự động thiết lập kết nối SSL với máy chủ . Khi Curl gửi yêu cầu tới một URL HTTPS, nó sẽ kiểm tra chứng chỉ SSL đối với kho lưu trữ chứng chỉ của CA cục bộ.

PHP có an toàn không?

Curl hỗ trợ SSL v2, v3 và TLS phiên bản 1. 0 đến 1. 3. Chỉ TLS 1. 2 và TLS 1. 3 được coi là an toàn hôm nay . Trên thực tế, hầu hết các trình duyệt không còn chấp nhận kết nối với SSL và TLS 1. 0 và TLS 1. 1.

Tôi có thể sử dụng curl trong PHP không?

Công dụng của cURL trong PHP . cURL giúp kết nối giữa các trang web và tên miền khác nhau trở nên đơn giản. Lấy một bản sao của tài liệu của một trang web. Gửi biểu mẫu tự động, xác thực và sử dụng cookie. cURL is a PHP extension that allows you to use the URL syntax to receive and submit data. cURL makes it simple to connect between various websites and domains. Obtaining a copy of a website's material. Submission of forms automatically, authentication and cookie use.

Chủ Đề