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


232

ฉันใช้ WAMP ในสภาพแวดล้อมการพัฒนาท้องถิ่นและกำลังพยายามเรียกเก็บเงินจากบัตรเครดิต แต่ได้รับข้อความแสดงข้อผิดพลาด:

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

ฉันค้นหาข้อมูลจำนวนมากบน Google และมีผู้คนจำนวนมากแนะนำให้ฉันดาวน์โหลดไฟล์นี้: cacert.pemวางไว้ที่ใดที่หนึ่งและอ้างอิงใน php.ini ของฉัน นี่คือส่วนหนึ่งใน php.ini ของฉัน:

curl.cainfo = "C:\Windows\cacert.pem"

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

ฉันใช้ WAMP จาก Apache Modules และเปิดใช้งาน ssl_module และจากส่วนขยาย PGP ฉันเปิดใช้งาน php_curl

ยังคงเป็นข้อความข้อผิดพลาดเดียวกัน ทำไมถึงเกิดขึ้น?

ตอนนี้ฉันกำลังติดตามการแก้ไขนี้: วิธีแก้ไข PHP CURL Error 60 SSL

ซึ่งแนะนำให้ฉันเพิ่มบรรทัดเหล่านี้ในตัวเลือก cURL ของฉัน:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, true);

ฉันจะเพิ่มตัวเลือกใน cURL ของฉันได้ที่ไหน เห็นได้ชัดว่าไม่ผ่านบรรทัดคำสั่งเนื่องจาก CLI ของฉันไม่พบคำสั่ง "curl_setopt"

แก้ไข

นี่คือรหัสที่ฉันใช้:

public function chargeStripe()
{
    $stripe = new Stripe;
    $stripe = Stripe::make(env('STRIPE_PUBLIC_KEY'));

    $charge = $stripe->charges()->create([
        'amount'   => 2900,
        'customer' => Input::get('stripeEmail'),
        'currency' => 'EUR',
    ]);

    dd($charge);

    // echo $charge[Input::get('stripeToken')];


    return Redirect::route('step1');
}

สมมติว่าไม่มีปัญหากับรหัสของคุณอาจเป็นไฟร์วอลล์ของคุณ ลองปิดการใช้งานไฟร์วอลล์ของคุณเพื่อทดสอบ
Waqar ul islam

ฉันไม่ได้ให้คุณตอบคำถามนี้ที่นี่ ? :)
Limon Monte

@limonte เป็นไปได้ต้องเปลี่ยนโครงการและอาจมีปัญหาเดียวกันกับโครงการใหม่ จะเปลี่ยนกลับไปเป็นปัญหาการดื่มสุราและบางทีมันก็เป็นปัญหาเดียวกัน BRB
LoveAndHappiness

1
คุณลองใช้แถบรุ่นล่าสุดแล้วหรือยัง ฉันเห็นข้อความการส่งข้อความที่เปลี่ยนแปลงบางอย่างเกี่ยวกับ certs ... github.com/stripe/stripe-php/commit/
......

1
@LoveAndHappiness คุณมีทางออกสำหรับปัญหานี้หรือไม่? ฉันกำลังเผชิญกับข้อผิดพลาดเดียวกันกับแถบ โปรดแจ้งให้เราทราบหากคุณมีทางออกใด ๆ
Dev

คำตอบ:


515

วิธีแก้ปัญหาการทำงานสมมติว่าคุณใช้ Windows โดยใช้ XAMPP:

เซิร์ฟเวอร์ XAMPP

  1. คล้ายกับสภาพแวดล้อมอื่น ๆ
    • ดาวน์โหลดและแตกไฟล์ cacert.pem ที่นี่ (รูปแบบไฟล์ / ข้อมูลที่สะอาด)

https://curl.haxx.se/docs/caextract.html

  1. วางไว้ที่นี่ในไดเรกทอรีต่อไปนี้

C: \ XAMPP \ PHP \ แถม \ SSL \ cacert.pem

  1. ใน php.ini ของคุณใส่บรรทัดนี้ในส่วนนี้ ("c: \ xampp \ php \ php.ini"):
;;;;;;;;;;;;;;;;;;;;
; php.ini Options  ;
;;;;;;;;;;;;;;;;;;;;

curl.cainfo = "C:\xampp\php\extras\ssl\cacert.pem"
  1. รีสตาร์ทเว็บเซิร์ฟเวอร์ / apache ของคุณ

  2. แก้ไขปัญหา!

(การอ้างอิง: https://laracasts.com/discuss/channels/general-discussion/curl-error-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate )


6
ข้อความนี้กำลังจะมาเนื่องจากเวอร์ชั่น PHP ของคุณ ถ้ามันมาจาก PHP 5.5 ก็จะเกิดข้อผิดพลาดนี้ขึ้นเพราะฟีเจอร์ใหม่ของ PHP 5.6 PHP 5.6 ตรวจสอบใบรับรองหากคุณใช้ cURL
UWU_SANDUN

9
ขอบคุณสำหรับคำตอบ! แม้ว่าฉันจะแนะนำให้ใช้ cacert.pem จากหน้า Curl อย่างเป็นทางการ: curl.haxx.se/docs/caextract.html
dieBeiden

6
แค่ต้องการชี้ให้ทุกคนที่ไม่สามารถใช้งานได้ - ฉันใช้เครื่องหมายทับcurl.cainfo = "C:/cacert.pem"ซ้ายและต้องรีสตาร์ทคอมพิวเตอร์เพื่อให้มันใช้งานได้ เพิ่งรีสตาร์ทเว็บเซิร์ฟเวอร์ไม่เพียงพอ หวังว่าจะช่วยให้:]
space_food_

1
และอย่าลืมที่จะไม่แสดงความเห็นcurl.cainfo(
ใบหน้า

ทำงานเหมือนจับใจ! ขอบคุณ
แจ็ค

55

ให้ความสนใจผู้ใช้ Wamp / Wordpress / windows ฉันมีปัญหานี้หลายชั่วโมงและไม่ใช่คำตอบที่ถูกต้องสำหรับฉันเพราะฉันแก้ไขไฟล์ php.ini ผิดเพราะคำถามนั้นตอบ XAMPP และไม่ใช่สำหรับผู้ใช้ WAMP แม้ว่าคำถามนั้นจะเป็น WAMP ก็ตาม

นี่คือสิ่งที่ฉันทำ

ดาวน์โหลดชุดใบรับรอง

วางไว้ข้างในของ C:\wamp64\bin\php\your php version\extras\ssl

ตรวจสอบให้แน่ใจว่าไฟล์mod_ssl.soอยู่ภายในC:\wamp64\bin\apache\apache(version)\modules

เปิดใช้งานmod_sslในhttpd.confด้านในของไดเรกทอรี ApacheC:\wamp64\bin\apache\apache2.4.27\conf

เปิดใช้งานในphp_openssl.dll php.iniระวังปัญหาของฉันคือฉันมีไฟล์ php.ini สองไฟล์และฉันต้องทำสิ่งนี้ทั้งสองไฟล์ อันแรกสามารถอยู่ในไอคอนทาสก์บาร์ของ WAMP ได้ที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

และอีกอันตั้งอยู่ใน C:\wamp64\bin\php\php(Version)

ค้นหาตำแหน่งสำหรับทั้งสองphp.iniไฟล์และค้นหาบรรทัดcurl.cainfo =และให้เส้นทางแบบนี้

curl.cainfo = "C:\wamp64\bin\php\php(Version)\extras\ssl\cacert.pem"

ตอนนี้บันทึกไฟล์และรีสตาร์ทเซิร์ฟเวอร์ของคุณและคุณควรจะไป


มันน้อยกว่าที่คุณต้องทำทั้งสอง php.ini มากกว่าทำสิ่งที่คุณตั้งใจจะใช้: ถ้าคุณใช้ apache เป็นลูกค้า SAPI จากนั้นแก้ไขหนึ่งใน apache dir และ / หรือแก้ไขหนึ่งในไคลเอนต์ dir ถ้าคุณวางแผนที่จะใช้ php.exe เป็น SAPI
Fabien Haddadi

3
"ฉันต้องทำสิ่งนี้ทั้งสองอย่าง" คือบันทึกย่อที่สำคัญ ขอบคุณ
Jaroslav Klimčík

1
ใช้งานได้กับ Laravel 5.5 ด้วย "guzzlehttp / guzzle": "^ 6.3" เซิร์ฟเวอร์ Wamp 3.1.3 Php 7.1 *
Deepesh Thapa

ใช้งานได้ ขอบคุณ
user4906240

ขอบคุณที่ตอบ wamp
altoids

46

หากคุณใช้ PHP 5.6 กับ Guzzle Guzzle ได้เปลี่ยนไปใช้การตรวจสอบอัตโนมัติของไลบรารี PHP สำหรับใบรับรองแทนที่จะเป็นกระบวนการ ( อ้างอิง ) PHP แสดงการเปลี่ยนแปลงที่นี่

การค้นหาที่ PHP / Guzzle กำลังมองหาใบรับรอง

คุณสามารถดัมพ์ตำแหน่งที่ PHP มองหาโดยใช้:

 var_dump(openssl_get_cert_locations());

การรับชุดใบรับรอง

สำหรับการทดสอบ OS X คุณสามารถใช้ homebrew เพื่อติดตั้ง openssl brew install opensslจากนั้นใช้openssl.cafile=/usr/local/etc/openssl/cert.pemในการตั้งค่า php.ini หรือ Zend Server ของคุณ (ภายใต้ OpenSSL)

ชุดใบรับรองยังมีให้จาก curl / Mozilla บนเว็บไซต์ curl: https://curl.haxx.se/docs/caextract.html

การบอก PHP ว่าใบรับรองอยู่ที่ไหน

เมื่อคุณมีชุดบันเดิลแล้วให้วางไว้ในตำแหน่งที่ PHP ค้นหาอยู่แล้ว (ซึ่งคุณค้นพบด้านบน) หรืออัปเดตopenssl.cafileใน php.ini (โดยทั่วไป/etc/php.iniหรือ/etc/php/7.0/cli/php.iniหรือ/etc/php/php.iniบน Unix.)


3
ใช่. หลังจากเห็นผู้คนจำนวนมากเกินไปแนะนำให้เห็นว่าแนวทางที่ไม่ถูกต้องอย่างชัดเจนของการลดระดับด้วยหมายเลขรุ่นต่าง ๆ นี่เป็นวิธีที่ถูกต้อง ฉันทำตามคำแนะนำของผู้อื่นเกี่ยวกับร้านกาแฟ แต่ไม่มีวิธีทดสอบว่าทำไมมันถึงไม่โหลด openssl_get_cert_locations () ฟังก์ชันนี้ใช้เพื่อระบุปัญหาของฉัน ขอบคุณ!
เว็บและ Flow

1
ขอบคุณที่ให้บริการopenssl_get_cert_locationsมันทำให้การดีบักง่ายขึ้นมาก ดูเหมือนว่า WAMP ใช้ไฟล์ ini ที่แตกต่างกันสำหรับ apache php มากกว่าสำหรับ console php ในกรณีของฉันฉันต้องเพิ่มopenssl.cafile="c:/_/cacert.pem"php สำหรับคอนโซล ครั้งที่แล้วเมื่อใช้งานผ่าน apache ฉันต้องcurl.cainfo="c:/_/cacert.pem"ทำให้มันใช้งานได้
psycho brm

16

Guzzle ซึ่งใช้โดยcartalyst / แถบจะทำสิ่งต่อไปนี้เพื่อค้นหาไฟล์เก็บถาวรใบรับรองที่เหมาะสมเพื่อตรวจสอบใบรับรองเซิร์ฟเวอร์กับ:

  1. ตรวจสอบว่าopenssl.cafileตั้งอยู่ในไฟล์ php.ini ของคุณหรือไม่
  2. ตรวจสอบว่าcurl.cainfoตั้งอยู่ในไฟล์ php.ini ของคุณหรือไม่
  3. ตรวจสอบว่า/etc/pki/tls/certs/ca-bundle.crtมีอยู่ (Red Hat, CentOS, Fedora; จัดทำโดยแพ็คเกจใบรับรอง CA)
  4. ตรวจสอบว่า/etc/ssl/certs/ca-certificates.crtมีอยู่ (Ubuntu, Debian; จัดทำโดยแพ็คเกจใบรับรอง CA)
  5. ตรวจสอบว่า/usr/local/share/certs/ca-root-nss.crtมีอยู่ (FreeBSD จัดทำโดยแพ็คเกจ ca_root_nss)
  6. ตรวจสอบว่า/usr/local/etc/openssl/cert.pem(OS X จัดทำโดย homebrew)
  7. ตรวจสอบว่าC:\windows\system32\curl-ca-bundle.crtมีอยู่ (Windows)
  8. ตรวจสอบว่าC:\windows\curl-ca-bundle.crtมีอยู่ (Windows)

คุณจะต้องตรวจสอบให้แน่ใจว่ามีการกำหนดค่าสำหรับการตั้งค่าสองรายการแรกอย่างเหมาะสมโดยทำการทดสอบอย่างง่าย:

echo "openssl.cafile: ", ini_get('openssl.cafile'), "\n";
echo "curl.cainfo: ", ini_get('curl.cainfo'), "\n";

หรือลองเขียนไฟล์ลงในตำแหน่งที่ระบุโดย # 7 หรือ # 8


13

หากคุณไม่สามารถเปลี่ยน php.ini ได้คุณสามารถชี้ไปที่ไฟล์ cacert.pem จากรหัสเช่นนี้:

$http = new GuzzleHttp\Client(['verify' => '/path/to/cacert.pem']);
$client = new Google_Client();
$client->setHttpClient($http);

8

สิ่งที่ฉันทำคือใช้var_dump(openssl_get_cert_locations()); die;ในสคริปต์ php ใด ๆ ซึ่งให้ข้อมูลเกี่ยวกับค่าเริ่มต้นที่ php ท้องถิ่นของฉันใช้:

array (size=8)
  'default_cert_file' => string 'c:/openssl-1.0.1c/ssl/cert.pem' (length=30)
  'default_cert_file_env' => string 'SSL_CERT_FILE' (length=13)
  'default_cert_dir' => string 'c:/openssl-1.0.1c/ssl/certs' (length=27)
  'default_cert_dir_env' => string 'SSL_CERT_DIR' (length=12)
  'default_private_dir' => string 'c:/openssl-1.0.1c/ssl/private' (length=29)
  'default_default_cert_area' => string 'c:/openssl-1.0.1c/ssl' (length=21)
  'ini_cafile' => string 'E:\xampp\php\extras\ssl\cacert.pem' (length=34)
  'ini_capath' => string '' (length=0)

ในขณะที่คุณสามารถสังเกตเห็นฉันได้ตั้งค่า ini_cafile หรือตัวเลือก ini curl.cainfo แต่ในกรณีของฉันขดจะพยายามใช้ "default_cert_file" ซึ่งไม่มีอยู่

ฉันคัดลอกไฟล์จากhttps://curl.haxx.se/ca/cacert.pemไปยังตำแหน่งสำหรับ "default_cert_file" (c: /openssl-1.0.1c/ssl/cert.pem) และฉันก็สามารถรับมันได้ ไปทำงาน.

นี่เป็นทางออกเดียวสำหรับฉัน


ฉันมีปัญหาที่คล้ายกันและที่ตั้งของฉันคือสิ่งที่คล้ายกับ c: /usr/local/ssl/cert.pem แต่ตำแหน่งนี้ไม่มีอยู่คุณทำในสิ่งที่ควรจะเป็นนอกจากนี้โครงการเดียวกันนี้จะใช้โดย coluge ของฉันบนเครื่อง Mac นั่นคือเหตุผลที่ฉันลองทุกอย่างแล้วนั่นคือการเพิ่มตำแหน่งใบรับรองในไฟล์. ini แต่มันใช้งานไม่ได้ดูเหมือนว่าโซลูชันของคุณจะทำงานได้ดี แต่ไม่สามารถเปลี่ยนตำแหน่งนั้นและไม่สามารถวางใบรับรองได้ ในสถานที่ซึ่งไม่มีอยู่
AbdulMueed

คุณสามารถลองสร้างโฟลเดอร์และวางใบรับรองที่เส้นทางที่คุณระบุได้หรือไม่?
George Donev

7

ฉันมีปัญหานี้ปรากฏออกมาสีน้ำเงินวันหนึ่งเมื่อสคริปต์ Guzzle (5) พยายามเชื่อมต่อกับโฮสต์ผ่าน SSL แน่นอนว่าฉันสามารถปิดการใช้งานตัวเลือก VERIFY ใน Guzzle / Curl ได้ แต่นั่นไม่ใช่วิธีที่ถูกต้อง

ฉันลองทุกอย่างที่ระบุไว้ที่นี่และในกระทู้ที่คล้ายกันจากนั้นในที่สุดก็ไปที่ terminal ด้วย openssl เพื่อทดสอบกับโดเมนที่ฉันพยายามเชื่อมต่อ:

openssl s_client -connect example.com:443 

... และได้รับสองสามบรรทัดแรกระบุ:

CONNECTED(00000003)
depth=0 CN = example.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = example.com
verify error:num=21:unable to verify the first certificate
verify return:1 

... ในขณะที่ทุกอย่างทำงานได้ดีเมื่อลองใช้ปลายทางอื่น (เช่น: google.com ฯลฯ )

สิ่งนี้กระตุ้นให้ฉันติดต่อโดเมนที่ฉันพยายามเชื่อมต่อและแน่นอนพวกเขามีปัญหาในตอนจบของพวกเขาที่พุ่งขึ้น มันได้รับการแก้ไขและสคริปต์ของฉันกลับไปใช้งานได้

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


6

ฉันพบวิธีแก้ปัญหาที่เหมาะกับฉัน ฉันลดระดับจากคำแนะนำล่าสุดเป็นเวอร์ชัน ~ 4.0 และใช้งานได้

ใน composer.json เพิ่ม "guzzlehttp / guzzle": "~ 4.0"

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


สิ่งนี้จะป้องกันไม่ให้คุณใช้คุณสมบัติเวอร์ชัน 5/6 ใด ๆ แต่ให้ตั้งค่าการตรวจสอบเป็นเท็จในอาร์เรย์พารามิเตอร์ (วิธีการร้องขอที่ 3): $ client-> request ('GET', '/', ['Verify' => false]);
..

3

ตรวจสอบให้แน่ใจว่าคุณเปิดphp.iniไฟล์โดยตรงจาก Window Explorer ของคุณ (ในกรณีของฉัน:C:\DevPrograms\wamp64\bin\php\php5.6.25 )

อย่าใช้ทางลัดในการ php.iniในเมนูของไอคอน Wamp / Xamp ใน System Tray ทางลัดนี้ใช้ไม่ได้ในกรณีนี้

จากนั้นแก้ไขที่php.ini:

curl.cainfo ="C:/DevPrograms/wamp64/bin/php/cacert.pem" 

และ

openssl.cafile="C:/DevPrograms/wamp64/bin/php/cacert.pem"

หลังจากบันทึกphp.iniคุณไม่จำเป็นต้อง "เริ่มบริการทั้งหมด" ในไอคอน Wamp หรือปิด / เปิด CMD อีกครั้ง


2

คุณเคยลอง ..

curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false);

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


2

ฉันใช้เวลามากเกินไปในการหาปัญหานี้ให้ฉัน

ฉันมี PHP เวอร์ชัน 5.5 และฉันจำเป็นต้องอัปเกรดเป็น 5.6

ในเวอร์ชัน <5.6 Guzzle จะใช้ไฟล์ cacert.pem ของตัวเอง แต่ในเวอร์ชันที่สูงกว่าของ PHP มันจะใช้ไฟล์ cacert.pem ของระบบ

ฉันยังดาวน์โหลดไฟล์จากที่นี่https://curl.haxx.se/docs/caextract.htmlและตั้งเป็น php.ini

พบคำตอบในไฟล์ Guzzles StreamHandler.php https://github.com/guzzle/guzzle/blob/0773d442aa96baf19d7195f14ba6e9c2da11f8ed/src/Handler/StreamHandler.php#L437

        // PHP 5.6 or greater will find the system cert by default. When
        // < 5.6, use the Guzzle bundled cacert.

2

คำตอบทั้งหมดถูกต้อง; แต่สิ่งที่สำคัญที่สุดคือคุณต้องหาไฟล์ php.ini ที่ถูกต้อง ตรวจสอบคำสั่งนี้ใน cmd "php --ini" ไม่ใช่คำตอบที่ถูกต้องสำหรับการค้นหาไฟล์ php.ini ที่ถูกต้อง

ถ้าคุณแก้ไข

curl.cainfo ="PATH/cacert.pem"

และตรวจสอบ

var_dump(openssl_get_cert_locations()); 

ดังนั้น curl.cainfo ควรมีค่า ถ้าไม่ใช่นั่นไม่ใช่ไฟล์ php.ini ที่ถูกต้อง

* ฉันแนะนำให้คุณค้นหา * .ini ใน wamp / bin หรือ xxamp / bin หรือเซิร์ฟเวอร์ใด ๆ ที่คุณใช้และทำการเปลี่ยนแปลงทีละรายการและตรวจสอบ * * * *


1

ฉันเพิ่งพบปัญหาเดียวกันนี้กับเฟรมเวิร์ก Laravel 4 php ซึ่งใช้guzzlehttp/guzzleแพ็คเกจผู้แต่ง ด้วยเหตุผลบางอย่างใบรับรอง SSL สำหรับ mailgun หยุดการตรวจสอบโดยฉับพลันและฉันได้รับข้อความ "error 60" เดียวกัน

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

// vendor/guzzlehttp/guzzle/src/Client.php
    $settings = [
        'allow_redirects' => true,
        'exceptions'      => true,
        'decode_content'  => true,
        'verify'          => __DIR__ . '/cacert.pem'
    ];

นี่ล่อใช้กองกำลังของไฟล์ cacert.pem ของตัวเองภายในซึ่งน่าจะเป็นตอนนี้ออกจากวันแทนการใช้อย่างใดอย่างหนึ่งที่ได้รับจากสภาพแวดล้อมของม้วน การเปลี่ยนบรรทัดนี้ (บน Linux อย่างน้อย) กำหนดค่า Guzzle ให้ใช้ตรรกะการตรวจสอบ SSL เริ่มต้นของ cURL และแก้ไขปัญหาของฉัน:

        'verify'          => true

คุณสามารถตั้งค่านี้falseหากคุณไม่สนใจเกี่ยวกับความปลอดภัยของการเชื่อมต่อ SSL ของคุณ แต่นั่นไม่ใช่วิธีที่ดี

เนื่องจากไฟล์ที่อยู่ในvendorนั้นไม่ได้มีไว้เพื่อดัดแปลงแก้ไขดังนั้นทางเลือกที่ดีกว่าก็คือการกำหนดค่าไคลเอนต์ Guzzleในการใช้งาน แต่สิ่งนี้ยากเกินไปที่จะทำใน Laravel 4

หวังว่าจะช่วยให้คนอื่นดีบักสองสามชั่วโมง ...


1

นี่อาจเป็นกรณีที่มีขอบ แต่ในกรณีของฉันปัญหาไม่ได้เป็นไคลเอนต์ (ฉันได้curl.cainfoกำหนดไว้แล้วphp.ini) แต่เซิร์ฟเวอร์ระยะไกลไม่ได้รับการกำหนดค่าอย่างถูกต้อง:

มันไม่ได้ส่งcertsกลางใด ๆในห่วงโซ่ ไม่มีข้อผิดพลาดในการเรียกดูเว็บไซต์โดยใช้ Chrome แต่ด้วย PHP ฉันได้รับข้อผิดพลาดดังต่อไปนี้

ข้อผิดพลาด cURL 60

หลังจากรวมIntermediate Certsในการกำหนดค่าเว็บเซิร์ฟเวอร์ระยะไกล

คุณสามารถใช้ไซต์นี้เพื่อตรวจสอบการกำหนดค่า SSL ของเซิร์ฟเวอร์ของคุณ:

https://whatsmychaincert.com/


1

เมื่อฉันเรียกใช้'var_dump(php_ini_loaded_file());' ฉันได้รับผลลัพธ์นี้ในหน้าของฉัน 'C:\Development\bin\apache\apache2.4.33\bin\php.ini' (length=50)'

และเพื่อให้ php โหลดไฟล์ใบรับรองฉันต้องแก้ไข php.ini ในเส้นทางนี้'C:\Development\bin\apache\apache2.4.33\bin\php.ini' และเพิ่มopenssl.cafile="C:/Development/bin/php/php7.2.4/extras/ssl/cacert.pem"ตำแหน่งที่ฉันดาวน์โหลดและวางไฟล์ใบรับรองของฉันจากhttps://curl.haxx.se/docs/caextract.html

am บน windows 10 โดยใช้ drupal 8, wamp และ php7.2.4


0

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

update-ca-certificates

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

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


-1

ขณะที่คุณใช้ Windows ฉันคิดว่าตัวคั่นพา ธ ของคุณคือ '\' (และ '/' บน Linux) DIRECTORY_SEPARATORลองใช้อย่างต่อเนื่อง รหัสของคุณจะพกพาได้มากกว่า

ลอง:

curl_setopt($process, CURLOPT_CAINFO, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'cacert.pem');

แก้ไข: และเขียนเส้นทางแบบเต็ม ฉันมีปัญหาบางอย่างเกี่ยวกับเส้นทางสัมพัทธ์ (อาจเป็นไปได้ว่าจะดำเนินการจากไดเรกทอรีฐานอื่น)


1
สิ่งนี้จะไม่สร้างความแตกต่างเนื่องจากการตั้งค่า cURL จริงเกินการควบคุมของคุณเมื่อคุณใช้ไลบรารีแถบนั้น
Ja͢ck

-1

ถ้าคุณใช้ WAMP คุณควรเพิ่มบรรทัดใบรับรองใน php.ini สำหรับ Apache (นอกเหนือจากไฟล์ php.ini เริ่มต้น):

[curl]
curl.cainfo = C:\your_location\cacert.pem

ทำงานได้กับ php5.3 +


ใช่ ระวังการแก้ไขทั้งไฟล์ apache และ php version php.ini สำหรับผู้ใช้ WAMP คำตอบนี้เป็นเพียงการแก้ปัญหาของฉัน: stackoverflow.com/questions/28858351/…
MavBzh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.