HTTPS và SSL3_GET_SERVER_CERTIFICATE: xác minh chứng chỉ không thành công, CA vẫn ổn


208

Tôi đang sử dụng XAMPP để phát triển. Gần đây tôi đã nâng cấp cài đặt xampp của mình từ phiên bản cũ lên 1.7.3.

Bây giờ khi tôi cuộn các trang web kích hoạt HTTPS, tôi gặp ngoại lệ sau

Lỗi nghiêm trọng: Đã hủy ngoại lệ 'RequestCore_Exception' với thông báo 'cURL resource: Resource id # 55; Lỗi cURL: Sự cố chứng chỉ SSL, xác minh rằng chứng chỉ CA vẫn ổn. Chi tiết: lỗi: 14090086: Các thói quen SSL: SSL3_GET_SERVER_CERTIFICATE: xác minh chứng chỉ không thành công (60) '

Mọi người đề nghị sử dụng một số tùy chọn cuộn tròn cụ thể từ mã PHP để khắc phục vấn đề này. Tôi nghĩ rằng đây không phải là cách. Bởi vì tôi không gặp vấn đề gì với phiên bản XAMPP cũ của mình và chỉ xảy ra sau khi cài đặt phiên bản mới.

Tôi cần trợ giúp để tìm ra những thay đổi nào trong cài đặt PHP của tôi, Apache, v.v. có thể khắc phục vấn đề này.

Câu trả lời:


145

curl được sử dụng để bao gồm một danh sách các CA được chấp nhận, nhưng không còn bó BẤT K cer CA nào. Vì vậy, theo mặc định, nó sẽ từ chối tất cả các chứng chỉ SSL là không thể xác minh.

Bạn sẽ phải lấy chứng chỉ CA của bạn và chỉ vào đó. Thêm chi tiết tại Chi tiết của cURLS về Chứng chỉ SSL máy chủ .


4
Các curl đang xảy ra trong thư viện php dịch vụ web của Amazon. Tôi không hiểu cách sửa nó mà không chỉnh sửa mã thư viện.
Josnidhin

41
Sau đó tắt xác minh chứng chỉ ( CURLOPT_SSL_VERIFYPEER-> sai). Bạn có thể thêm chứng chỉ CA của trang web bạn đang cố gắng thực hiện SSL hoặc bạn vô hiệu hóa xác minh CA. Đó là hai lựa chọn duy nhất có sẵn.
Marc B

78
Chỉ cần fyi - thiết lập CURLOPT_SSL_VERIFYPEERđể falseđánh bại mục đích sử dụng SSL.
Đến

13
@Till không đánh bại nó một nửa mục đích của SSL? Bạn vẫn có được quyền riêng tư giữa bạn và bạn bè: bạn không có tính xác thực của bạn bè.
Mark Fox

10
không có tính xác thực, điểm nào trong việc mã hóa dữ liệu bạn đang gửi? Nếu bạn đã là MITMed thì dữ liệu vẫn bị xâm phạm
hdgarrood

290

Đây là một vấn đề khá phổ biến trong Windows. Bạn chỉ cần thiết lập cacert.pemđể curl.cainfo.

Vì PHP 5.3.7 bạn có thể làm:

  1. tải xuống https://curl.haxx.se/ca/cacert.pem và lưu nó ở đâu đó.
  2. cập nhật php.ini- thêm curl.cainfo = "PATH_TO / cacert.pem"

Nếu không, bạn sẽ cần phải làm như sau cho mọi tài nguyên cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

2
Điều này đã làm việc với tôi trong XAMPP trên OS X. Nó đã khắc phục sự cố trong đó plugin Wordpress sẽ không cập nhật do không thể tìm thấy chứng chỉ cục bộ.
Jonathan Nicol

8
Đối với bất kỳ ai khác đang cố gắng giải quyết vấn đề này trên Windows bằng Apache, tôi đã phải đặt đường dẫn đầy đủ (ví dụ: C: \ PATH_TO \ cacert.pem) trong mã PHP của tôi. Trên IIS, đường dẫn tương đối có vẻ hoạt động tốt.
http203

Nếu cacert.pem nằm trong cùng thư mục thì curl_setopt ($ ch, CURLOPT_CAINFO, dirname ( FILE ). '/Cacert.pem'); sẽ hoạt động
mujaffars

7
Khi sử dụng WampServer với 2., bạn phải thêm biến vào hai php.initệp riêng biệt . Xem stackoverflow.com/a/25706713/1101095
Nate

Điều khó hiểu / mỉa mai là bạn có thể tải xuống curl.haxx.se/ca/cacert.pem qua HTTPS mà không chỉ định bất kỳ tùy chọn bổ sung nào. Là chứng chỉ cho curl.haxx.se sao lưu vào chính curl?
qbolec

84

Cảnh báo: điều này có thể giới thiệu các vấn đề bảo mật mà SSL được thiết kế để bảo vệ chống lại, khiến toàn bộ cơ sở mã hóa của bạn không an toàn. Nó đi ngược lại mọi thực hành được đề nghị.

Nhưng một sửa chữa thực sự đơn giản mà làm việc cho tôi là gọi:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

trước khi gọi:

curl_exec():

trong tập tin php.

Tôi tin rằng điều này vô hiệu hóa tất cả các xác minh chứng chỉ SSL.


65
... và bằng cách vô hiệu hóa xác minh chứng chỉ, bạn để ngỏ khả năng tấn công MITM tiềm năng, mà SSL / TLS nếu không nhằm mục đích bảo vệ chống lại. ĐỪNG LÀM ĐIỀU NÀY!
Bruno

12
Vâng Tôi nên đã thu hút sự chú ý nhiều hơn về điều này trong câu trả lời. Chỉ làm điều này nếu bạn không làm việc trên bất cứ điều gì quan trọng. Tôi sử dụng nó trên localhost để truy cập các trang web mà cá nhân tôi đã lập trình.
Chris Dutrow

3
Downvote từ tôi. Đây là một sửa chữa bẩn để làm cho mã của bạn hoạt động, nhưng không phải là một giải pháp. Câu trả lời được cung cấp bởi ррррррр
Ilija

2
@Bruno Đây là giải pháp hoàn hảo, cho các kịch bản trợ giúp, kiểm tra, ứng dụng đáng tin cậy, mạng nội bộ, ..... Mọi người biết A LITTLE về SSL, đều biết trong trường hợp nào có thể bỏ qua xác thực chứng chỉ. Vì vậy, tất cả các nhận xét 'thông minh' về câu trả lời này và những điều như 'ĐỪNG LÀM ĐIỀU NÀY' chỉ là KHÔNG CÓ !!
Kenyakorn Ketsombut 13/03/2015

5
... " Mọi người biết MỘT LITTLE về SSL [...] " ... và bạn sẽ ngạc nhiên khi nhiều người thậm chí không bận tâm khi biết một chút về những điều cơ bản của SSL / TLS, và sẽ đến ở đây để sao chép / dán một sửa chữa nhanh chóng cho thông báo lỗi của họ.
Bruno

53

Nguồn: http://ademar.name/blog/2006/04/curl-ssl-certert-probols-v.html

Curl: Vấn đề chứng chỉ SSL, xác minh rằng chứng chỉ CA là OK

07 tháng 4 năm 2006

Khi mở url bảo mật bằng Curl, bạn có thể gặp lỗi sau:

Sự cố chứng chỉ SSL, xác minh rằng chứng chỉ CA vẫn ổn

Tôi sẽ giải thích tại sao lỗi và những gì bạn nên làm về nó.

Cách dễ nhất để loại bỏ lỗi sẽ là thêm hai dòng sau vào tập lệnh của bạn. Giải pháp này đặt ra một rủi ro bảo mật tho.

//WARNING: this would prevent curl from detecting a 'man in the middle' attack
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 

Hãy xem hai tham số này làm gì. Trích dẫn hướng dẫn.

CURLOPT_SSL_VERIFYHOST : 1 để kiểm tra sự tồn tại của một tên chung trong chứng chỉ ngang hàng SSL. 2 để kiểm tra sự tồn tại của một tên chung và cũng xác minh rằng nó phù hợp với tên máy chủ được cung cấp.

CURLOPT_SSL_VERIFYPEER : FALSE để ngăn chặn CURL xác minh chứng chỉ của người dùng. Chứng chỉ thay thế để xác minh chống lại có thể được chỉ định bằng tùy chọn CURLOPT_CAINFO hoặc thư mục chứng chỉ có thể được chỉ định bằng tùy chọn CURLOPT_CAPATH. CURLOPT_SSL_VERIFYHOST cũng có thể cần TRUE hoặc FALSE nếu CURLOPT_SSL_VERIFYPEER bị tắt (mặc định là 2). Đặt CURLOPT_SSL_VERIFYHOST thành 2 (Đây là giá trị mặc định) sẽ đảm bảo rằng chứng chỉ được xuất trình cho bạn có 'tên chung' khớp với URN mà bạn đang sử dụng để truy cập tài nguyên từ xa. Đây là một kiểm tra lành mạnh nhưng nó không đảm bảo chương trình của bạn không bị từ chối.

Nhập 'người đàn ông ở giữa'

Thay vào đó, chương trình của bạn có thể bị lừa khi nói chuyện với máy chủ khác. Điều này có thể đạt được thông qua một số cơ chế, như dns hoặc arp ngộ độc (Đây là một câu chuyện cho một ngày khác). Kẻ xâm nhập cũng có thể tự ký một chứng chỉ có cùng 'tên comon' mà chương trình của bạn đang mong đợi. Thông tin liên lạc vẫn sẽ được mã hóa nhưng bạn sẽ tiết lộ bí mật của mình cho kẻ mạo danh. Kiểu tấn công này được gọi là 'người ở giữa'

Đánh bại 'người đàn ông ở giữa'

Vâng, chúng tôi cần phải xác minh giấy chứng nhận được trình bày cho chúng tôi là tốt cho thực tế. Chúng tôi làm điều này bằng cách so sánh nó với một chứng chỉ mà chúng tôi tin tưởng * hợp lý.

Nếu tài nguyên từ xa được bảo vệ bởi một chứng chỉ được cấp bởi một trong những CA chính như Verisign, GeoTrust et al, bạn có thể so sánh một cách an toàn với gói chứng chỉ CA của Mozilla mà bạn có thể nhận được từ http://curl.haxx.se/docs/caextract .html

Lưu tệp cacert.pemở đâu đó trong máy chủ của bạn và đặt các tùy chọn sau trong tập lệnh của bạn.

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");

cho tất cả các thông tin trên Tín dụng chuyển đến: http://ademar.name/blog/2006/04/curl-ssl-cert ve-pro Hiệu-v.html


38
Nó thường được coi là lịch sự để ghi nhận nguồn thông tin của bạn và chỉ trích dẫn một số phần nhất định liên quan đến câu hỏi, thay vì chỉ đơn giản là sao chép và dán nó vào đây!
Dan Herd

1
Xin lỗi, tôi đã đi vắng, vâng tôi đánh giá cao Dan vì điều đó và đã cập nhật bài đăng
Deepak Oberoi

6
Ít nhất Deepak đã nỗ lực nghiên cứu nó. @danherd Vậy danherd, bạn vừa thực hiện nghiên cứu để thấy rằng anh ấy đã lấy mã từ đâu đó? Quyền quy kết của mã này là gì? Thay vì lãng phí thời gian của bạn để tìm lỗi lầm của người khác, hãy cố gắng tự mình giúp đỡ ai đó. Đừng đánh nhau, chia sẻ!
GTodorov

17

Các giải pháp trên rất tuyệt vời, nhưng nếu bạn đang sử dụng WampServer, bạn có thể thấy cài đặt curl.cainfobiến trong php.inikhông hoạt động.

Cuối cùng tôi đã tìm thấy WampServer có hai php.initệp:

C:\wamp\bin\apache\Apachex.x.x\bin
C:\wamp\bin\php\phpx.x.xx

Cái đầu tiên rõ ràng được sử dụng khi các tệp PHP được gọi thông qua trình duyệt web, trong khi tệp thứ hai được sử dụng khi lệnh được gọi thông qua dòng lệnh hoặc shell_exec().

TL; DR

Nếu sử dụng WampServer, bạn phải thêm curl.cainfodòng vào cả hai php.ini tệp.


6

Vì tình yêu của tất cả những gì là thánh ...

Trong trường hợp của tôi, tôi đã phải thiết lập openssl.cafile biến cấu hình PHP thành đường dẫn tệp PEM.

Tôi tin rằng rất đúng là có nhiều hệ thống trong đó cài đặt curl.cainfocấu hình của PHP là chính xác những gì cần thiết, nhưng trong môi trường tôi đang làm việc, đó là bộ chứa docker eboraas / laravel , sử dụng Debian 8 (jessie) và PHP 5.6, thiết lập biến đó không thực hiện được mẹo.

Tôi nhận thấy rằng đầu ra php -ikhông đề cập bất cứ điều gì về cài đặt cấu hình cụ thể đó, nhưng nó có một vài dòng về openssl. Có cả tùy chọn openssl.capathopenssl.cafiletùy chọn, nhưng chỉ cần đặt cái thứ hai cho phép cuộn qua PHP để cuối cùng cũng ổn với URL HTTPS.


Cảm ơn bạn! Cài đặt curl.cainfo cũng không hiệu quả với tôi, nhưng cài đặt openssl.cafile đã làm! Tôi đang dùng Windows 7 với XAMPP và PHP 7.1.1.
knezmilos

@knezmilos bạn đã cài đặt openssl.cafile như thế nào? Bạn đã tải về ở đâu và làm thế nào để bạn kích hoạt nó?
Krys

Chà, đã lâu rồi nhưng tôi nghĩ nó giống như thế này: curl.cainfo = "C: \ xampp \ cacert \ cacert.pem" và openssl.cafile = "C: \ xampp \ cacert \ cacert.pem" trong php. ini, trong khi tôi nghĩ rằng tôi đã nhận được tệp pem từ một trong những câu trả lời ở đây.
knezmilos

1
"Vì tình yêu của tất cả những gì là thánh ..." thực sự. Điều này làm việc cho thiết lập Ubuntu 18,08 / Apache / Php7.2 của tôi. Nếu lỗi cuộn tròn đang chỉ vào đúng tệp, thì đó chắc chắn là lỗi mở
JTG

4

Đôi khi, nếu ứng dụng bạn cố gắng liên hệ có chứng chỉ tự ký, thì cacert.pem bình thường từ http://curl.haxx.se/ca/cacert.pem không giải quyết được vấn đề.

Nếu bạn chắc chắn về url điểm cuối dịch vụ, hãy truy cập nó thông qua trình duyệt, lưu chứng chỉ theo cách thủ công ở định dạng "Chứng chỉ X 509 với chuỗi (PEM)". Trỏ tệp chứng chỉ này với

curl_setopt ($ch, CURLOPT_CAINFO, "pathto/{downloaded certificate chain file}");   

4

Tôi có cùng một lỗi trên amazon AMI linux.

Tôi đã giải quyết bằng cách đặt curl.cainfo trên /etc/php.d/curl.ini

https://gist.github.com/reinaldomendes/97fb2ce8a606ec813c4b

Bổ sung tháng 10 năm 2018

Trên Amazon Linux v1 chỉnh sửa tệp này

vi /etc/php.d/20-curl.ini

Để thêm dòng này

curl.cainfo="/etc/ssl/certs/ca-bundle.crt"

Hoàn hảo, cảm ơn! Tôi đã cập nhật câu hỏi để thêm chính xác những gì tôi đã làm đã giải quyết vấn đề cho tôi, thay vì tạo ra một câu trả lời khác.
Tim

3

Khi đặt các tùy chọn cuộn tròn cho CURLOPT_CAINFO, hãy nhớ sử dụng dấu ngoặc đơn, sử dụng dấu ngoặc kép sẽ chỉ gây ra lỗi khác. Vì vậy, tùy chọn của bạn sẽ giống như:

curl_setopt ($ch, CURLOPT_CAINFO, 'c:\wamp\www\mywebfolder\cacert.pem');

Ngoài ra, trong cài đặt tệp php.ini của bạn phải được viết là: (chú ý dấu ngoặc kép của tôi)

curl.cainfo = "C:\wamp\www\mywebfolder"

Tôi đặt nó trực tiếp bên dưới dòng có nội dung này: extension=php_curl.dll

(Đối với tổ chức mục đích duy nhất, bạn có thể đặt nó ở bất cứ đâu trong phạm vi của mình php.ini, tôi chỉ cần đặt nó gần với một tài liệu tham khảo curl vì vậy khi tôi tìm kiếm bằng từ khóa curl Tôi Caan tìm thấy cả hai tài liệu tham khảo curl trong một khu vực.)


1
Tôi hy vọng php.ini nên trỏ đến tệp pem thay vì thư mục mẹ của nó
dejjub-AIS

2

Tôi đã kết thúc ở đây khi cố gắng để có được GuheadsHttp (php + apache trên Mac) để lấy một trang từ www.googleapis.com.

Đây là giải pháp cuối cùng của tôi trong trường hợp nó giúp được bất cứ ai.

Nhìn vào chuỗi chứng chỉ cho bất kỳ tên miền nào cung cấp cho bạn lỗi này. Đối với tôi đó là googleapis.com

openssl s_client -host www.googleapis.com -port 443

Bạn sẽ nhận lại một cái gì đó như thế này:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Lưu ý: Tôi đã nắm bắt được điều này sau khi tôi khắc phục sự cố, để đầu ra chuỗi của bạn có thể trông khác.

Sau đó, bạn cần xem các chứng chỉ được phép trong php. Chạy phpinfo () trong một trang.

<?php echo phpinfo();

Sau đó tìm tệp chứng chỉ được tải từ đầu ra trang:

openssl.cafile  /usr/local/php5/ssl/certs/cacert.pem

Đây là tệp bạn sẽ cần sửa bằng cách thêm (các) chứng chỉ chính xác vào nó.

sudo nano /usr/local/php5/ssl/certs/cacert.pem

Về cơ bản, bạn cần phải thêm "chữ ký" chứng chỉ chính xác vào cuối tệp này.

Bạn có thể tìm thấy một số trong số họ ở đây: Bạn có thể cần google / tìm kiếm những người khác trong chuỗi nếu bạn cần họ.

Họ trông như thế này:

hình ảnh chứng chỉ ví dụ

( Lưu ý: Đây là hình ảnh để mọi người không chỉ cần sao chép / dán chứng chỉ từ stackoverflow )

Khi các chứng chỉ phù hợp có trong tệp này, hãy khởi động lại apache và kiểm tra.


0

Bạn có thể thử cài đặt lại ca-certificatesgói hoặc cho phép rõ ràng chứng chỉ được đề cập như được mô tả ở đây .


-5

Giải pháp này rất đơn giản! Đặt dòng này trước curl_exec:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Đối với tôi nó hoạt động.


7
Không bao giờ, bao giờ xác minh đẳng vô hiệu hóa, trừ khi bạn không quan tâm nếu dữ liệu bị tổn thương trong quá cảnh.
ndlowrey

Đã đồng ý. Nếu bạn muốn một ứng dụng an toàn, bạn cần xác minh ngang hàng.
braden

2
"Không bao giờ, vô hiệu hóa xác minh ngang hàng" KHÔNG GIỚI HẠN bạn muốn chức năng trình duyệt mặc định haha. Ngoài ra, tại sao điều này bị hạ cấp rất nhiều? Đây là câu trả lời duy nhất ngắn gọn, ngọt ngào, đến mức VÀ hiệu quả.
Adam F

@AdamF FYI, các trình duyệt DO xác minh chứng chỉ ngang hàng theo mặc định, họ chỉ cung cấp cho bạn tùy chọn để bỏ qua lỗi thủ công, với một cảnh báo.
Bruno
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.