Hướng dẫn dùng cacert pem trong PHP

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Chào các bạn, bài viết hôm nay mình sẽ chia sẻ 1 cách để fix lỗi Curl SSL khi PHP hoạt động trên Windows Server trên nền IIS.

Tuyển php nhiều ngành nghề hot trong tháng

Lỗi Curl SSL xảy ra khi nào?

Thông thường khi bạn cài đặt PHP trên máy chủ Windows Server, mọi thứ hoạt động bình thường. Cho đến một ngày bạn add thêm SSL Certificate cho ứng dụng của bạn. Có thể bạn sẽ gặp lỗi dưới đây:

“Curl [60] SSL Certificate Problem: Unable to get local issuer certificate”

PHP Curl được sử dụng trong hầu hết các ứng dụng có dùng API

Lỗi này không quá nghiêm trọng, tuy nhiên nếu không biết cách xử lý, bạn sẽ tốn khá nhiều thời gian vào việc này.

Fix lỗi Curl SSL Certificate Problem: Unable to get local issuer certificate

Vấn đề này xảy ra do bị thiếu chứng chỉ CA từ Mozilla. Do đó ta chỉ cần thêm chứng chỉ này vào thư mục SSL của PHP.
Các bước thực hiện như sau:

  • Bước 1: Tải “cacert.pem” từ link: //curl.haxx.se/docs/caextract.html [//curl.haxx.se/ca/cacert.pem]
  • Bước 2: Lưu file cacert.pem vào folder SSL của PHP. Tùy thuộc vào phiên bản PHP bạn đang sử dụng. Đường dẫn có thể như sau:

  • Bước 3: Thêm đường dẫn vào file cấu hình php.ini của bạn.

  • Bước 4: Khởi động lại IIS Server của bạn. Có thể chạy câu lệnh “iisreset” từ command prompt với quyền admin để khởi động lại IIS server.
  • Cuối cùng test và kiểm tra lại các bước thực hiện trên

Chúc các bạn thành công!

  • Hướng dẫn tạo certificate SSL trên Windows [file key, pem]
  • Fix Lỗi FTP Client Windows Server “Current Security Settings Do Not Allow This File To Be Downloaded”
  • Xử lý SSL Certificate trong Selenium WebDriver

answer

275

Cuối cùng cũng có cái này để làm việc!

  1. Tải về gói chứng chỉ .

  2. Đặt nó ở đâu đó. Trong trường hợp của tôi, đó là c:\wamp\thư mục [nếu bạn đang sử dụng Wamp 64 bit thì nó c:\wamp64\].

  3. Kích hoạt mod_ssltrong Apache và php_openssl.dlltrong php.ini[bỏ ghi chú chúng bằng cách xóa ;lúc đầu]. Nhưng hãy cẩn thận, vấn đề của tôi là tôi có hai php.initệp và tôi cần phải làm điều này trong cả hai. Một là cái bạn nhận được từ biểu tượng thanh tác vụ WAMP của bạn và một cái khác là, trong trường hợp của tôi, trongC:\wamp\bin\php\php5.5.12\

  4. Thêm các dòng này vào chứng chỉ của bạn trong cả hai php.initệp:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. Khởi động lại dịch vụ Wamp.

275 hữu ích 5 bình luận chia sẻ

answer

101

Disclaimer: Mã này làm cho máy chủ của bạn không an toàn.

Tôi gặp vấn đề tương tự trong tệp Mandrill.php sau dòng số 65 trong đó có ghi $ this-> ch = curl_init [];

Thêm hai dòng sau:

curl_setopt[$this->ch, CURLOPT_SSL_VERIFYHOST, 0];
curl_setopt[$this->ch, CURLOPT_SSL_VERIFYPEER, 0];

Điều này đã giải quyết vấn đề của tôi và cũng đã gửi email bằng localhost nhưng tôi đề nghị KHÔNG sử dụng nó trên phiên bản trực tiếp. Trên máy chủ trực tiếp của bạn, mã sẽ hoạt động mà không cần mã này.

101 hữu ích 4 bình luận chia sẻ

answer

41

Cảm ơn @Mladen Janjetovic,

Đề xuất của bạn đã làm việc cho tôi trong mac với cài đặt ampps.

Đã sao chép: //curl.haxx.se/ca/cacert.pem

Đến: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

Và được cập nhật php.inivới đường dẫn đó và khởi động lại Apache:

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"
openssl.cafile="/Applications/AMPPS/extra/etc/openssl/certs/cacert.pem"

Và áp dụng cài đặt tương tự trong cài đặt Windows AMPPS và nó cũng hoạt động hoàn hảo trong đó.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/Ampps/php/extras/ssl/cacert.pem"
openssl.cafile="C:/Ampps/php/extras/ssl/cacert.pem"

: Tương tự cho wamp.

[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"
openssl.cafile="C:/wamp/bin/php/php5.6.16/extras/ssl/cacert.pem"

Nếu bạn đang tìm cách tạo chứng chỉ SSL mới bằng SAN cho localhost, các bước trên bài đăng này đã có hiệu quả với tôi Centos 7 / Vagrant / Chrome Browser.

41 hữu ích 0 bình luận chia sẻ

answer

18

Khi bạn xem trang //curl.haxx.se/docs/caextract.html , bạn sẽ nhận thấy bằng chữ lớn một phần có tên:

Đã xóa RSA-1024

Đọc nó, sau đó tải xuống phiên bản chứng chỉ bao gồm chứng chỉ 'RSA-1024'. //github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

Những người sẽ làm việc với Mandrill.

Vô hiệu hóa SSL là một ý tưởng tồi.

18 hữu ích 5 bình luận chia sẻ

answer

10

Các bước trên, mặc dù hữu ích, không hoạt động với tôi trên Windows 8. Tôi không biết mối quan hệ đồng hành, nhưng các bước dưới đây đã hoạt động. Về cơ bản là một sự thay đổi trong tập tin cacert.pem. Hy vọng điều này sẽ giúp được ai đó.

  • Tải xuống tệp cacert.pem từ đây: //curl.haxx.se/docs/caextract.html
  • Lưu tệp trong thư mục cài đặt PHP của bạn. [ví dụ: Nếu sử dụng xampp - hãy lưu nó trong c: \ Installer_Dir \ xampp \ php \ cacert.pem].
  • Mở tệp php.ini của bạn và thêm các dòng sau:
  • curl.cainfo = xông C: \ Installer_Dir \ xampp \ php \ cacert.pem, openssl.cafile =, C: \ Installer_Dir \ xampp \ php \ cacert.pem tựa
  • Khởi động lại máy chủ Apache của bạn và điều đó sẽ khắc phục nó [Đơn giản chỉ cần dừng và bắt đầu các dịch vụ khi cần thiết].

10 hữu ích 0 bình luận chia sẻ

answer

9

Tôi tìm thấy Giải pháp mới mà không có bất kỳ chứng nhận bắt buộc nào để gọi curl chỉ thêm hai mã dòng.

curl_setopt[$ch, CURLOPT_FOLLOWLOCATION, TRUE];
curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, false];

9 hữu ích 3 bình luận chia sẻ

answer

7

Nếu bạn không có quyền truy cập vào php.ini , việc thêm mã này [sau $ch = curl_init[];dòng của bạn ] sẽ hoạt động với tôi:

$certificate_location = "C:\Program Files [x86]\EasyPHP-Devserver-16.1\ca-bundle.crt"; // modify this line accordingly [may need to be absolute]
curl_setopt[$ch, CURLOPT_CAINFO, $certificate_location];
curl_setopt[$ch, CURLOPT_CAPATH, $certificate_location];

Sau đó, bạn sẽ chỉ cần tải ca-bundle.crt và lưu nó vào vị trí bạn đã chỉ định $certificate_location.

7 hữu ích 0 bình luận chia sẻ

answer

2

xây dựng các câu trả lời trên để triển khai máy chủ.

$hostname = gethostname[];
if[$hostname=="mydevpc"]
{
    curl_setopt[$ch, CURLOPT_FOLLOWLOCATION, TRUE];
    curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, false];
}

nên thực hiện thủ thuật cho môi trường phát triển mà không ảnh hưởng đến máy chủ khi triển khai.

2 hữu ích 1 bình luận chia sẻ

answer

0

Tôi gặp vấn đề tương tự trong quá trình xây dựng ứng dụng của mình trong AppVeyor.

  • Tải xuống //curl.haxx.se/ca/cacert.pem đểc:\php
  • Kích hoạt openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • Xác định vị tríecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0 hữu ích 0 bình luận chia sẻ

answer

0

Nếu không có giải pháp nào ở trên hoạt động cho bạn, hãy thử cập nhật cài đặt XAMPP của bạn lên phiên bản mới hơn.

Tôi đã chạy XAMPP với php 5.5.11, cùng một mã chính xác không hoạt động, tôi đã nâng cấp lên XAMPP với php 5.6.28 và các giải pháp trên đã hoạt động.

Ngoài ra, chỉ cập nhật PHP không hoạt động có vẻ như là sự kết hợp của cài đặt apache và php trên phiên bản XAMPP đó.

Hy vọng nó sẽ giúp được ai đó.

0 hữu ích 0 bình luận chia sẻ

answer

0

Tôi có giải pháp rất đơn giản cho vấn đề này. Bạn có thể làm điều này mà không cần bất kỳ tập tin chứng chỉ ..

Đi trên Laravel thư mục gốc -> Vender -> guzzlehttp -> tật ham ăn -> src

mở Client.php

tìm $ mặc định Mảng. Trông giống như thế này ..

$defaults = [
    'allow_redirects' => RedirectMiddleware::$defaultSettings,
    'http_errors'     => true,
    'decode_content'  => true,
    'verify'          => true,
    'cookies'         => false
];

Bây giờ công việc chính là thay đổi giá trị của khóa xác minh ..

'verify'          => false,

Vì vậy, sau này, nó sẽ không kiểm tra Chứng chỉ SSL cho Yêu cầu CURL ... Giải pháp này phù hợp với tôi. Tôi tìm thấy giải pháp này sau nhiều nghiên cứu ...

0 hữu ích 0 bình luận chia sẻ

answer

0

Tôi đã thử nó hoạt động

mở

vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php

và thay đổi điều này

 $conf[CURLOPT_SSL_VERIFYHOST] = 2;
 `enter code here`$conf[CURLOPT_SSL_VERIFYPEER] = true;

đến đây

$conf[CURLOPT_SSL_VERIFYHOST] = 0;
$conf[CURLOPT_SSL_VERIFYPEER] = FALSE;

0 hữu ích 0 bình luận chia sẻ

answer

0

Tôi đã nhận được lỗi như:

failed loading cafile stream: `C:\xamppPhp\apache\bin\curl-ca-bundle.crt`

Tôi đang sử dụng máy windows. Vì vậy, tôi làm theo các bước dưới đây.

1. I have downloaded .pem file from " //curl.haxx.se/docs/caextract.html "

2. Then I kept the downloaded file inside  "C:/xamppPhp/apache/bin/" folder and renamed the same downloaded file to "curl-ca-bundle.crt".

3. I restarted XAMPP and cleared the cache.
4. It's done.

Hy vọng nó có thể giúp được ai đó

0 hữu ích 0 bình luận chia sẻ

Chủ Đề