PHP - Lỗi chứng chỉ SSL: không thể lấy chứng chỉ nhà phát hành cục bộ


187

Tôi đang chạy phiên bản PHP 5.6.3 như một phần của XAMPP trên Windows 7.

Khi tôi cố gắng sử dụng API Mandrill, tôi gặp phải lỗi sau:

Đã hủy ngoại lệ 'Mandrill_HttpError' với thông báo 'Cuộc gọi API đến tin nhắn / mẫu gửi không thành công: Vấn đề chứng chỉ SSL: không thể nhận chứng chỉ nhà phát hành địa phương'

Tôi đã thử mọi thứ tôi đọc trên StackOverflow, bao gồm thêm phần sau vào tệp php.ini:

curl.cainfo = "C:\xampp\php\cacert.pem"

Và dĩ nhiên, đã tải xuống vị trí đó tệp cacert.pem từ http://curl.haxx.se/docs/caextract.html

nhưng sau tất cả, đã khởi động lại máy chủ XAMPP và Apache nhưng vẫn gặp lỗi tương tự.

Tôi thực sự không biết những gì khác để thử.

Bất cứ ai có thể tư vấn về những gì tôi có thể thử?


Xem câu trả lời của tôi: stackoverflow.com/a/29649024/660410
Michal-sk

3
Đồng thời đảm bảo rằng bạn đã bỏ sót dòng đó bằng cách xóa phần bắt đầu ';'. nó phải là curl.cainfo = "C: \ xampp \ php \ cacert.pem" chứ không phải; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan

Việc sử dụng HTTPS qua HTTP cũng sẽ gây ra lỗi này?
javiniar.leonard

Câu trả lời:


363

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.


3
Trong trường hợp của tôi đó là thư mục c: \ xamp \ và windows 7 và giải pháp này hoạt động hoàn hảo..cảm ơn rất nhiều ...
Manu RS

1
Gói chứng chỉ mới nhất có thể được tải xuống từ trang web curl ban đầu curl.haxx.se/docs/caextract.html
Paul

1
Trong trường hợp của tôi, dòng có một ;lúc đầu và tôi phải mất hàng giờ để nhận ra rằng nó có nghĩa là nó là một bình luận. như vậy cho noobs như tôi, một nhu cầu để loại bỏ các ;cũng
abhyudayasrinet

1
@SurajNeupane không chắc chắn, tôi đã dành rất nhiều thời gian để lấy lại cái này sau đó, tôi sử dụng máy ảo, như Homestead và tôi không phải đối phó với điều này. Đây là trường hợp cụ thể
Mladen Janjetovic

1
Đây là chìa khóaBut be careful, my problem was that I had two php.ini files and I need to do this in both of them. One is the one you get from your WAMP taskbar icon, and another one is, in my case, in C:\wamp\bin\php\php5.5.12\
AA

127

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.


1
bất cứ điều gì tôi có thể cố gắng để làm cho môi trường nhà phát triển của tôi hoạt động mà không cần bỏ qua điều này?
Dor Dadush

4
đối với tôi, chỉ cần thiết lập CURLOPT_SSL_VERIFYPEERđể falselàm việc.
Francisco Corrales Morales

29
Trong khi bạn đúng về mặt kỹ thuật, vô hiệu hóa SSL là một ý tưởng tồi. Ngay cả trên localhost, tốt hơn hết là tải đúng các chứng chỉ như được đề cập trong câu trả lời khác.
Cột sống

Trong khi bạn đúng về mặt kỹ thuật, vô hiệu hóa SSL là một ý tưởng tồi. Ngay cả khi nó phản đối kịch liệt để làm việc theo bất kỳ cách nào khác, tốt hơn là mất việc của bạn hơn là làm những việc theo cách quản trị hệ thống không phù hợp. @Spinal

45

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: http://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 AMPPS của windows 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.


18

Khi bạn xem trang http://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'. https://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.


1
Điều này đã khắc phục sự cố với AWS / Guheads / cURL Tôi đã phải vật lộn cả ngày. Cảm ơn bạn!
voidstate

@voidstate Tôi biết điều này là cũ nhưng bạn cũng có thể bỏ qua nó trong bửa tiệc ăn sử dụng này [ 'xác minh' => sai], cho doc đầy đủ về ssl / curl / tật ham ăn đi đây guzzle.readthedocs.org/en/latest/...
John

@ John nhưng điều đó sẽ làm mất khả năng xác minh SSL không phải là điều bạn muốn làm, vì vậy tôi không khuyên bạn nên làm điều đó.
Arturo Alvarado

1
Đối với Windows, bạn sẽ cần lưu các tệp trên máy chủ của mình (ví dụ: vào C: \ curl \ curl-ca-bundle.crt), sau đó thêm phần sau vào php.ini: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

Tôi chỉ có được điều này sau khi nó hoạt động hoàn hảo trong nhiều năm (thậm chí còn sống sót sau khi thay đổi máy chủ) nhưng tôi gặp khó khăn trong việc hiểu chính xác những gì đang diễn ra ở đây. Có phải đó là curl hoặc openssl đã được cập nhật và đã thay đổi thành một gói không tương thích với mailchimp?
Sammaye

11

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: http://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).

11

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
Trong khi điều này có thể hoạt động, điều này không được khuyến khích ở tất cả. Về cơ bản, bạn đang nói, tin tưởng tất cả các chứng chỉ ... và nó cũng mở ứng dụng của bạn để có thể tấn công nếu bạn quên và mã của bạn khiến nó được sản xuất với thay đổi này ... thực sự không có nhiều việc để tải xuống gói CA và thêm điểm PHP vào nó.
user919426

đó là khái niệm curl, vì vậy bất cứ khi nào bạn sử dụng curl, hãy thêm mã ở trên
Manish sharma

8

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.


3

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 ...


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.


Chạy các phần khác nhau của mã của bạn trong các môi trường khác nhau nghe có vẻ không phải là một khái niệm hay - nó làm cho việc gỡ lỗi trở nên khó khăn hơn
Nico Haase

2

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

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 https://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

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

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 " https://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

Tôi đã phải đối mặt với một vấn đề như thế này trong hệ thống cục bộ của tôi nhưng không phải trong máy chủ trực tiếp. Tôi cũng đã đề cập đến một giải pháp khác trên trang này trước đây, nhưng nó không hoạt động trong localhost . Vì vậy, hãy tìm một giải pháp mới này, đó là hoạt động trong máy chủ localhost-WAMP .

Lỗi cURL #: Sự cố chứng chỉ SSL: không thể nhận chứng chỉ nhà phát hành địa phương

đôi khi hệ thống không thể tìm thấy cacert.pem của bạn trong ổ đĩa của bạn. vì vậy bạn có thể xác định điều này trong mã của bạn, nơi bạn sẽ sử dụng CURL

Lưu ý rằng tôi đang đáp ứng tất cả các điều kiện cho việc này như thư viện OPEN-SSL đang hoạt động và những thứ khác.

kiểm tra mã này của CURL .

 $curl = curl_init();
 curl_setopt_array($curl, array(
            CURLOPT_URL =>$url,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_RETURNTRANSFER=> true,
        ));
curl_setopt($curl, CURLOPT_CAINFO, "f:/wamp/bin/cacert.pem"); // <------ 
curl_setopt($curl, CURLOPT_CAPATH, "f:/wamp/bin/cacert.pem"); // <------
$response = json_decode(curl_exec($curl),true);
$err = curl_error($curl);
curl_close($curl);

nhưng giải pháp này có thể không hoạt động trong máy chủ trực tiếp. bởi vì đường dẫn tuyệt đối của cacert.pem


0

Tôi có một giải pháp thích hợp cho vấn đề này, hãy thử và hiểu nguyên nhân gốc rễ của vấn đề này. Vấn đề này xảy ra khi ssl máy chủ từ xa không thể được xác minh bằng chứng chỉ gốc trong kho chứng chỉ hệ thống của bạn hoặc ssl từ xa không được cài đặt cùng với chứng chỉ chuỗi. Nếu bạn có một hệ thống linux có quyền truy cập ssh gốc, thì trong trường hợp này, bạn có thể thử cập nhật kho chứng chỉ của mình bằng lệnh dưới đây:

update-ca-certificates

Nếu vẫn không hoạt động thì bạn cần thêm chứng chỉ gốc và tạm thời của máy chủ từ xa trong cửa hàng chứng chỉ của bạn. Bạn có thể tải xuống các certs gốc và trung gian và thêm chúng vào thư mục / usr / local / share / ca-cert rồi chạy lệnh update-ca-certificates. Cái này cần phải dùng mẹo. Tương tự cho các cửa sổ, bạn có thể tìm kiếm cách thêm chứng chỉ gốc và chứng chỉ trung gian.

Một cách khác để bạn có thể giải quyết vấn đề này là yêu cầu nhóm máy chủ từ xa thêm chứng chỉ ssl dưới dạng một gói chứng chỉ gốc tên miền, chứng chỉ trung gian và chứng chỉ gốc.


-4

để biết được bạn có thể thử điều này:

$client = new Client(env('API_HOST'));
$client->setSslVerification(false);

đã thử nghiệm trên guồng / guin 3. *


1
Có một điểm trả lời một câu hỏi cũ 3 năm có câu trả lời được chấp nhận với hơn 200 câu hỏi không?
treyBake

Câu trả lời của tôi đơn giản hơn những câu hỏi trên, bạn sẽ thấy tôi sẽ nhận được 10 lượt upvote trong vài tháng ...
fico7361 16/11/18

1
Tôi rất nghi ngờ điều đó, không thấy bất kỳ đề cập nào về tội lỗi trong OP ... vì vậy đó là một câu trả lời không liên quan. Điều này cũng tương tự khi ai đó cung cấp giải pháp jQuery cho vấn đề JavaScript. Nó không liên quan.
treyBake

Điều đó không thay đổi thực tế nó không được sử dụng ở đây. Bạn có đề xuất giải pháp Linux cho người dùng Windows không vì nó là hệ điều hành máy chủ được sử dụng nhiều nhất? Không phải ai cũng muốn sử dụng Guheads, cá nhân tôi chưa bao giờ sử dụng nó một lần trong những năm sử dụng PHP. Đối với tôi, một yêu cầu HTTP thực sự không khó để cần một gói cho nó.
treyBake

1
nhận thức đầy đủ - nó chỉ không cần thiết .. chỉ cần đọc các tài liệu cho curl và tất cả đều tự giải thích. Không phải là thông minh hơn ... mà là trả lời đúng câu hỏi
treyBake 16/11/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.