PHP - ข้อผิดพลาดใบรับรอง SSL: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น


189

ฉันใช้ PHP เวอร์ชัน 5.6.3 เป็นส่วนหนึ่งของ XAMPP บน Windows 7

เมื่อฉันพยายามใช้ Mandrill API ฉันได้รับข้อผิดพลาดต่อไปนี้:

ไม่ได้รับการยกเว้นข้อยกเว้น 'Mandrill_HttpError' พร้อมข้อความ 'การเรียก API ไปยังข้อความ / แม่แบบส่งล้มเหลว: ปัญหาใบรับรอง SSL: ไม่สามารถรับใบรับรองผู้ออกในท้องถิ่น'

ฉันลองทุกอย่างที่ฉันอ่านบน StackOverflow แล้วรวมถึงการเพิ่มสิ่งต่อไปนี้ลงในไฟล์ php.ini:

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

และ ofcourse ดาวน์โหลดไปยังตำแหน่งนั้นไฟล์ cacert.pem จากhttp://curl.haxx.se/docs/caextract.html

แต่หลังจากนั้นให้รีสตาร์ท XAMPP และเซิร์ฟเวอร์ Apache แต่ยังคงได้รับข้อผิดพลาดเดียวกัน

ฉันไม่รู้จะลองอะไรอีก

ทุกคนสามารถให้คำแนะนำกับสิ่งอื่นที่ฉันสามารถลองได้หรือไม่?


ดูคำตอบของฉัน: stackoverflow.com/a/29649024/660410
Michal-sk

3
ตรวจสอบให้แน่ใจด้วยว่าคุณไม่ใส่เครื่องหมายข้อคิดเห็นในบรรทัดนั้นโดยลบการเริ่มต้น ';' มันควรจะเป็น curl.cainfo = "C: \ xampp \ php \ cacert.pem" มากกว่า; curl.cainfo = "C: \ xampp \ php \ cacert.pem"
Jon Tan

การใช้ HTTPS ผ่าน HTTP จะทำให้เกิดข้อผิดพลาดนี้ด้วยหรือไม่
javiniar.leonard

คำตอบ:


366

ในที่สุดได้รับการทำงาน!

  1. ดาวน์โหลดกำใบรับรอง

  2. วางไว้ที่ไหนสักแห่ง ในกรณีของฉันนั่นคือc:\wamp\ไดเรกทอรี (ถ้าคุณใช้ Wamp 64 บิตอยู่แล้วc:\wamp64\)

  3. เปิดใช้งานmod_sslใน Apache และphp_openssl.dllในphp.ini(ยกเลิกการใส่ข้อคิดเห็นโดยการลบ;ที่จุดเริ่มต้น) แต่ระวังปัญหาของฉันคือฉันมีสองphp.iniไฟล์และฉันต้องทำสิ่งนี้ทั้งสองไฟล์ อันที่หนึ่งคืออันที่คุณได้รับจากไอคอนทาสก์บาร์ของ WAMP และอีกอันคือในกรณีของฉันในC:\wamp\bin\php\php5.5.12\

  4. เพิ่มบรรทัดเหล่านี้ในใบรับรองของคุณในphp.iniไฟล์ทั้งสอง:

    curl.cainfo="C:/wamp/cacert.pem"
    openssl.cafile="C:/wamp/cacert.pem"
  5. เริ่มบริการ Wamp ใหม่


3
ในกรณีของฉันนั่นคือ c: \ xamp \ directory และ windows 7 และวิธีนี้ใช้งานได้ดีมากขอบคุณมาก ...
มนูอาร์เอส

1
สามารถดาวน์โหลดชุดใบรับรองล่าสุดได้จากไซต์ curl ต้นฉบับcurl.haxx.se/docs/caextract.html
Paul

1
ในกรณีของฉันบรรทัดมี;จุดเริ่มต้นและฉันใช้เวลาหลายชั่วโมงเพื่อตระหนักว่ามันหมายความว่ามันเป็นความคิดเห็น ดังนั้นสำหรับ noobs เช่นฉันหนึ่งต้องลบ;เช่นกัน
abhyudayasrinet

1
@SurajNeupane ไม่แน่ใจว่าฉันใช้เวลามากในการรับมันกลับมาแล้วฉันใช้เครื่องเสมือนเช่น Homestead และฉันไม่ต้องจัดการกับเรื่องนี้ นี่เป็นกรณีเฉพาะ
Mladen Janjetovic

2
นี่คือกุญแจสำคัญBut 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

คำเตือน: รหัสนี้ทำให้เซิร์ฟเวอร์ของคุณไม่ปลอดภัย

ฉันมีปัญหาเดียวกันในไฟล์ Mandrill.php หลังจากหมายเลขบรรทัดที่ 65 ซึ่งมันบอกว่า $ this-> ch = curl_init ();

เพิ่มสองบรรทัดต่อไปนี้:

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);

วิธีนี้แก้ไขปัญหาของฉันและส่งอีเมลโดยใช้ localhost แต่ฉันแนะนำไม่ให้ใช้กับ live version live บนเซิร์ฟเวอร์ที่ใช้งานจริงของคุณรหัสควรทำงานโดยไม่มีรหัสนี้


1
มีสิ่งใดบ้างที่ฉันสามารถทำให้สภาพแวดล้อมของนักพัฒนาซอฟต์แวร์ของฉันทำงานได้โดยไม่ต้องผ่านทางนี้
Dor Dadush

4
สำหรับฉันด้วยการตั้งค่าเพียงCURLOPT_SSL_VERIFYPEERเพื่อfalseทำงาน
Francisco Corrales Morales

29
แม้ว่าคุณจะถูกต้องทางเทคนิคการปิดใช้งาน SSL เป็นความคิดที่ไม่ดี แม้กระทั่งบน localhost จะเป็นการดีกว่าที่จะโหลดใบรับรองอย่างถูกต้องตามที่กล่าวไว้ในคำตอบอื่น ๆ
กระดูกสันหลัง

แม้ว่าคุณจะถูกต้องทางเทคนิคการปิดใช้งาน SSL เป็นความคิดที่ไม่ดี แม้ว่าจะมีความทนทานต่อการทำงานอย่างอื่นได้ดีกว่าที่จะสูญเสียงานของคุณกว่าทำในสิ่งที่ไม่เหมาะสม sys-admin @Spinal

45

ขอบคุณ @ Maden Janjetovic

คำแนะนำของคุณใช้ได้สำหรับฉันใน mac ที่ติดตั้งแอมป์

คัดลอกแล้ว: http://curl.haxx.se/ca/cacert.pem

ถึง: /Applications/AMPPS/extra/etc/openssl/certs/cacert.pem

และอัปเดตphp.iniด้วยเส้นทางนั้นและเริ่ม 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"

และใช้การตั้งค่าเดียวกันในการติดตั้ง windows AMPPS และมันทำงานได้อย่างสมบูรณ์ในนั้น

[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"

: เหมือนกันสำหรับ 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"

หากคุณกำลังมองหาการสร้างใบรับรอง SSL ใหม่โดยใช้ SAN สำหรับ localhost ขั้นตอนการโพสต์นี้Centos 7 / Vagrant / Chrome Browserทำงานสำหรับฉันใน


18

เมื่อคุณดู หน้าhttp://curl.haxx.se/docs/caextract.htmlคุณจะสังเกตเห็นตัวอักษรตัวใหญ่ส่วนที่เรียกว่า:

ลบ RSA-1024 แล้ว

อ่านจากนั้นดาวน์โหลดเวอร์ชันของใบรับรองที่มีใบรับรอง 'RSA-1024' https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt

สิ่งเหล่านั้นจะทำงานร่วมกับ Mandrill

การปิดใช้งาน SSL เป็นแนวคิดที่ไม่ดี


1
การแก้ไขปัญหานี้มีปัญหากับ AWS / Guzzle / cURL ฉันมีปัญหาตลอดทั้งวัน ขอบคุณ!
voidstate

@ voidstate ฉันรู้ว่านี่เก่า แต่คุณยังสามารถเลี่ยงผ่าน guzzle ได้โดยใช้ ['Verify' => false] สำหรับเอกสารฉบับเต็มของ ssl / curl / guzzle ไปที่นี่guzzle.readthedocs.org/en/latest/ ......
John

@John แต่นั่นจะเป็นการตรวจสอบ SSL ที่ไม่เห็นด้วยซึ่งไม่ใช่สิ่งที่คุณต้องการทำดังนั้นฉันไม่แนะนำให้ทำเช่นนั้น
Arturo Alvarado

1
สำหรับ Windows คุณจะต้องบันทึกไฟล์บนเซิร์ฟเวอร์ของคุณ (เช่น C: \ curl \ curl-ca-bundle.crt) จากนั้นเพิ่มสิ่งต่อไปนี้ใน php.ini ของคุณ: [curl] curl.cainfo = " C: /curl/curl-ca-bundle.crt "[openssl] openssl.cafile =" C: /curl/curl-ca-bundle.crt "
voidstate

ฉันเพิ่งได้รับมันหลังจากมันทำงานได้อย่างสมบูรณ์แบบสำหรับทุกวัย (แม้รอดชีวิตจากการเปลี่ยนแปลงของเซิร์ฟเวอร์) แต่ฉันมีปัญหาในการทำความเข้าใจสิ่งที่เกิดขึ้นที่นี่ เป็นว่า curl หรือ openssl ได้รับการปรับปรุงและมีการเปลี่ยนแปลงหรือไม่ s-bundle เปลี่ยนเป็นอันที่เข้ากันไม่ได้กับ mailchimp
Sammaye

11

ขั้นตอนข้างต้นมีประโยชน์ แต่ไม่ได้ผลสำหรับฉันใน Windows 8 ฉันไม่ทราบความสัมพันธ์ร่วม แต่ขั้นตอนด้านล่างใช้งานได้ การเปลี่ยนแปลงโดยทั่วไปในไฟล์ cacert.pem หวังว่านี่จะช่วยใครซักคน

  • ดาวน์โหลดไฟล์ cacert.pem ได้จากที่นี่: http://curl.haxx.se/docs/caextract.html
  • บันทึกไฟล์ในโฟลเดอร์การติดตั้ง PHP ของคุณ (เช่น: หากใช้ xampp - บันทึกไว้ใน c: \ Installation_Dir \ xampp \ php \ cacert.pem)
  • เปิดไฟล์ php.ini ของคุณและเพิ่มบรรทัดเหล่านี้:
  • curl.cainfo =” C: \ Installation_Dir \ xampp \ php \ cacert.pem” openssl.cafile =” C: \ Installation_Dir \ xampp \ php \ cacert.pem”
  • รีสตาร์ทเซิร์ฟเวอร์ Apache ของคุณและควรแก้ไข (เพียงหยุดและเริ่มบริการตามที่จำเป็น)

11

ฉันพบโซลูชันใหม่โดยไม่ต้องมีการรับรองใด ๆ เพื่อเรียก curl เพิ่มเพียงสองบรรทัด

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

9
ขณะนี้อาจใช้งานได้ แต่ก็ไม่แนะนำให้ทำเลย คุณกำลังพูดโดยทั่วไปเชื่อใจใบรับรองทั้งหมด ... และมันยังเปิดแอปพลิเคชันของคุณขึ้นมาสำหรับการโจมตีที่เป็นไปได้ถ้าคุณลืมและรหัสของคุณทำให้การผลิตมีการเปลี่ยนแปลงนี้ ... มันไม่ได้ผลมากนักในการดาวน์โหลด เพิ่ม PHP point ให้กับมัน
user919426

นั่นคือแนวคิดที่ขดดังนั้นเมื่อใดก็ตามที่คุณใช้ขดมีรหัสข้างต้น
Manish sharma

8

หากคุณไม่มีสิทธิ์เข้าถึงphp.iniการเพิ่มรหัสนี้ (หลังจาก$ch = curl_init();บรรทัดของคุณ) ใช้งานได้สำหรับฉัน:

$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);

จากนั้นคุณก็จะต้องดาวน์โหลดCA-bundle.crt$certificate_locationและบันทึกไปยังสถานที่ที่คุณระบุไว้ใน


3

ฉันมีทางออกที่ง่ายมากของปัญหานี้ คุณสามารถทำได้โดยไม่มีไฟล์ใบรับรองใด ๆ ..

ไปที่โฟลเดอร์ Laravel Root -> Vender -> guzzlehttp -> guzzle -> src

เปิดClient.php

ค้นหา Array $ เป็นค่าเริ่มต้น ที่มีลักษณะเช่นนี้ ..

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

ตอนนี้งานหลักคือการเปลี่ยนค่าของรหัสยืนยัน

'verify'          => false,

ดังนั้นหลังจากนี้จะไม่ตรวจสอบใบรับรอง SSL สำหรับคำขอ CURL ... โซลูชันนี้ใช้งานได้สำหรับฉัน ฉันพบวิธีนี้หลังจากการวิจัยหลาย ...


2

อธิบายเพิ่มเติมเกี่ยวกับคำตอบข้างต้นสำหรับการปรับใช้เซิร์ฟเวอร์

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

ควรทำเคล็ดลับสำหรับสภาพแวดล้อมการพัฒนาโดยไม่ส่งผลกระทบต่อเซิร์ฟเวอร์เมื่อปรับใช้


การใช้งานส่วนต่าง ๆ ของรหัสของคุณในสภาพแวดล้อมที่แตกต่างกันไม่ได้ฟังดูเหมือนแนวคิดที่ดี - ทำให้การดีบักหนักขึ้น
Nico Haase

2

ฉันลองมันใช้งานได้

เปิด

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

และเปลี่ยนสิ่งนี้

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

สำหรับสิ่งนี้

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

0

ฉันมีปัญหาเดียวกันระหว่างการสร้างแอพของฉันใน AppVeyor

  • ดาวน์โหลดhttps://curl.haxx.se/ca/cacert.pemไปที่c:\php
  • เปิดใช้งาน openssl echo extension=php_openssl.dll >> c:\php\php.ini
  • ค้นหาใบรับรองecho curl.cainfo=c:\php\cacert.pem >> c:\php\php.ini

0

หากวิธีการแก้ปัญหาด้านบนไม่ทำงานให้คุณลองอัปเดตการติดตั้ง XAMPP เป็นเวอร์ชันใหม่

ฉันใช้ XAMPP ด้วย php 5.5.11, รหัสที่แน่นอนเหมือนกันไม่ทำงานฉันอัพเกรดเป็น XAMPP ด้วย php 5.6.28 และวิธีแก้ปัญหาข้างต้นใช้ได้ผล

นอกจากนี้การอัปเดตเฉพาะ PHP ไม่ทำงานดูเหมือนว่าจะเป็นการรวมกันของการตั้งค่า apache และ php ใน XAMPP รุ่นนั้น

หวังว่าจะช่วยใครซักคน


0

ฉันได้รับข้อผิดพลาดเช่น:

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

ฉันใช้เครื่อง windows ดังนั้นฉันจึงทำตามขั้นตอนด้านล่าง

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.

หวังว่ามันจะช่วยใครซักคน


0

ฉันประสบปัญหาเช่นนี้ในระบบภายในเครื่องของฉันแต่ไม่ได้อยู่ในเซิร์ฟเวอร์ที่ใช้งานจริง ฉันยังกล่าวถึงวิธีอื่นในหน้านี้ก่อน แต่ที่ไม่ได้ทำงานในlocalhostดังนั้นหาทางออกใหม่นี้ไม่ว่าจะทำงานในlocalhost-WAMP เซิร์ฟเวอร์

ข้อผิดพลาด cURL #: ปัญหาใบรับรอง SSL: ไม่สามารถรับ ใบรับรองผู้ออกในท้องถิ่น

บางครั้งระบบไม่สามารถหาcacert.pemของคุณในไดรฟ์ของคุณ เพื่อให้คุณสามารถกำหนดสิ่งนี้ในรหัสของคุณที่คุณจะใช้CURL

โปรดทราบว่าฉันกำลังปฏิบัติตามเงื่อนไขทั้งหมดสำหรับสิ่งนี้เช่นไลบรารี OPEN-SSL ที่ใช้งานอยู่และสิ่งอื่น ๆ

ตรวจสอบรหัส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);

แต่วิธีนี้อาจไม่ทำงานในเซิร์ฟเวอร์ที่ใช้งานจริง เพราะเส้นทางที่แน่นอนของcacert.pem


0

ฉันมีวิธีแก้ไขปัญหาที่เหมาะสมลองใช้และทำความเข้าใจสาเหตุที่แท้จริงของปัญหานี้ ปัญหานี้เกิดขึ้นเมื่อเซิร์ฟเวอร์ระยะไกลไม่สามารถตรวจสอบ SSL โดยใช้ใบรับรองหลักในที่เก็บใบรับรองของระบบของคุณหรือไม่ได้ติดตั้ง SSL ระยะไกลพร้อมกับใบรับรองลูกโซ่ หากคุณมีระบบ linux พร้อมการเข้าถึงรูท ssh ในกรณีนี้คุณสามารถลองอัปเดตที่เก็บใบรับรองด้วยคำสั่งด้านล่าง:

update-ca-certificates

หากยังไม่สามารถใช้งานได้คุณจะต้องเพิ่มใบรับรอง root และใบรับรองชั่วคราวของเซิร์ฟเวอร์ระยะไกลในที่เก็บใบรับรองของคุณ คุณสามารถดาวน์โหลดใบรับรองรูทและสื่อกลางและเพิ่มในไดเร็กทอรี/ usr / local / share / ca-certificateจากนั้นรันคำสั่งupdate-ca-certificatesไดเรกทอรีแล้วใช้คำสั่งสิ่งนี้ควรทำเคล็ดลับ ในทำนองเดียวกันสำหรับ windows คุณสามารถค้นหาวิธีเพิ่ม root และใบรับรองระดับกลาง

วิธีอื่นที่คุณสามารถแก้ไขปัญหานี้ได้คือการขอให้ทีมเซิร์ฟเวอร์ระยะไกลเพิ่มใบรับรอง ssl เป็นชุดใบรับรองหลักของโดเมน, ใบรับรองกลางและใบรับรองกลาง


-4

สำหรับ guzzle คุณสามารถลองสิ่งนี้:

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

ทดสอบบน guzzle / guzzle 3. *


1
จะมีจุดตอบคำถามเก่า 3 ปีที่มีคำตอบที่ยอมรับกับ 200+ upvotes หรือไม่
treyBake

คำตอบของฉันง่ายกว่าคำตอบข้างต้นคุณจะเห็นว่าฉันจะได้รับ 10 upvotes ไม่กี่เดือน ...
fico7489

1
ฉันสงสัยอย่างมากว่าไม่ได้เอ่ยถึงการดื่มสุราใน OP ... ดังนั้นจึงเป็นคำตอบที่ไม่เกี่ยวข้อง มันเหมือนกันเมื่อมีคนเสนอวิธีแก้ปัญหา jQuery สำหรับปัญหา JavaScript มันไม่เกี่ยวข้อง
treyBake

แต่นั่นไม่ได้เปลี่ยนความจริงที่ว่าไม่ได้ใช้ที่นี่ คุณจะแนะนำโซลูชัน Linux ให้กับผู้ใช้ Windows เพราะเป็นระบบปฏิบัติการเซิร์ฟเวอร์ที่ใช้มากที่สุดหรือไม่ ไม่ใช่ทุกคนที่ต้องการใช้ Guzzle แต่โดยส่วนตัวฉันไม่เคยใช้ PHP สักครั้งในการใช้งาน PHP สำหรับฉันแล้วคำขอ HTTP ไม่ใช่เรื่องยากที่จะต้องการแพคเกจสำหรับมัน
treyBake

1
รับรู้อย่างเต็มที่ - ไม่จำเป็นต้องใช้เพียงแค่อ่านเอกสารสำหรับการม้วนและอธิบายด้วยตนเอง มันไม่ได้เกี่ยวกับความชาญฉลาด ... มันเกี่ยวกับการตอบคำถามอย่างถูกต้อง
treyBake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.