PHP CURL CURLOPT_SSL_VERIFYPEER ละเว้น


117

ด้วยเหตุผลบางประการฉันไม่สามารถใช้ CURL กับ HTTPS ได้ ทุกอย่างทำงานได้ดีจนกระทั่งฉันอัปเกรดไลบรารี curl ตอนนี้ฉันพบคำตอบนี้เมื่อพยายามดำเนินการร้องขอ CURL: ปัญหาเกี่ยวกับใบรับรอง SSL CA (เส้นทาง? สิทธิ์การเข้าถึง?)

คำแนะนำต่อไปนี้โพสต์ที่นี่เกี่ยวกับปัญหาที่เกี่ยวข้องฉันได้พยายามทำสิ่งต่อไปนี้:

  • ปิดการใช้งานการตรวจสอบสำหรับโฮสต์และเพียร์

    curl_setopt($cHandler, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);
  • เปิดใช้งานCURLOPT_SSL_VERIFYPEERและชี้ไปที่ cacert.pem ดาวน์โหลดจากhttp://curl.haxx.se/docs/caextract.html

    curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);  
    curl_setopt($cHandler, CURLOPT_CAINFO, getcwd() . "/positiveSSL.ca-bundle");
  • ฉันยังพยายามทำสิ่งเดียวกันกับ positiveSSL.ca-bundle ซึ่งให้ไว้เป็นใบรับรอง CA ของบันเดิลสำหรับเซิร์ฟเวอร์ที่ฉันพยายามเชื่อมต่อ

  • แก้ไขการตั้งค่า php ini ด้วยcurl.cainfo=cacert.pem(ไฟล์ในไดเร็กทอรีเดียวกันและเข้าถึงได้โดย apache)

  • เปลี่ยนชื่อ/etc/pki/nssdbเป็น/etc/pki/nssdb.old

โชคไม่ดีที่ข้อใดข้างต้นสามารถแก้ปัญหาของฉันได้และฉันได้รับข้อความ Problem with SSL CA cert (path? access rights?) อยู่ตลอดเวลา

และฉันไม่ต้องการการยืนยันนี้ตั้งแต่แรก (ฉันตระหนักถึงปัญหาด้านความปลอดภัย)

ใครมีคำแนะนำอื่น ๆ อีกไหม?

UPDATE

หลังจากอัปเดตเป็นไลบรารีล่าสุดและรีสตาร์ททั้งกล่องไม่ใช่แค่ apache ที่ฉันทำทุกอย่างดูเหมือนจะใช้งานได้อีกครั้ง !!!


1
คุณอัปเกรดไลบรารี Curl ที่คอมไพล์กับสแต็ก SSL อื่นหรือไม่ (อาจเป็น GnuTLS vs OpenSSL)
Bruno

ฉันจะไม่คิดอย่างนั้น ระบบคือ Fedora 16 และเป็นกรณีของการอัปเดตยำจริงๆ สิ่งที่น่ารำคาญที่สุดคือฉันไม่ต้องการ / ต้องการการตรวจสอบทั้งหมดนี้และดูเหมือนว่าฉันจะไม่สามารถปิดการใช้งานได้เลย
Greg

หากคุณต้องการใช้ HTTPS เพื่อความปลอดภัยคุณจะต้องมีกระบวนการตรวจสอบความถูกต้องนี้อยู่เสมอ
Bruno

ฉันทราบดีอย่างไรก็ตามกรณีการใช้งานของฉันที่นี่ทำให้ทุกอย่างซ้ำซ้อน นอกจากนี้ฉันได้อัปเดต curl เป็นเวอร์ชันล่าสุดพร้อมใช้งานแล้วและ php เป็น 5.4 ตอนนี้ข้อความแสดงข้อผิดพลาดหายไป แต่ฉันไม่ได้รับ cotnent ใด ๆ จาก curl :)
Greg

ฮ่าตอนนี้ฉันไปถึงที่ไหนสักแห่งฟังก์ชัน curl_errno รายงานสถานะ 77 ซึ่งตามคู่มือคือ CURLE_SSL_CACERT_BADFILE
Greg

คำตอบ:


240

ตามเอกสารประกอบ: ในการตรวจสอบใบรับรองโฮสต์หรือเพียร์คุณต้องระบุใบรับรองอื่นด้วยCURLOPT_CAINFOอ็อพชันหรือสามารถระบุไดเร็กทอรีใบรับรองด้วยCURLOPT_CAPATHอ็อพชัน

ยังดูที่ CURLOPT_SSL_VERIFYHOST:

  • 1 เพื่อตรวจสอบการมีอยู่ของชื่อสามัญใน SSL peer certificate
  • 2 เพื่อตรวจสอบการมีอยู่ของชื่อสามัญและตรวจสอบว่าตรงกับชื่อโฮสต์ที่ระบุ

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

5
การปิดการตรวจสอบ SSL จะเป็นการลบความปลอดภัยทั้งหมดของ SSL ออกไป คุณควรแก้ไขการกำหนดค่า PHP ของคุณแทน
Scopey

7
@Scopey แต่บางครั้งคุณอาจจำเป็นต้องใช้ในสภาพแวดล้อมการพัฒนาท้องถิ่นด้วยใบรับรองที่ลงนามด้วยตนเอง ดังนั้นอาจจะไม่สมเหตุสมผลกับสภาพแวดล้อมที่ไม่ใช่สาธารณะ แต่อย่างที่เตือนว่าควรมีคำเตือนในบันทึก (เช่นSSL verification disabled)
Ivan Borshchov

2

เรามีปัญหาเดียวกันกับเครื่อง CentOS7 การปิดใช้งานVERIFYHOST VERIFYPEERไม่ได้ช่วยแก้ปัญหาเราไม่มีข้อผิดพลาด cURL อีกต่อไป แต่การตอบสนองยังคงไม่ถูกต้อง การทำwgetลิงก์ไปยังลิงก์เดียวกับที่ cURL กำลังทำอยู่ยังส่งผลให้เกิดข้อผิดพลาดของใบรับรอง

-> วิธีแก้ปัญหาของเราคือการรีบูต VPS ซึ่งจะแก้ไขได้และเราสามารถดำเนินการตามคำขอได้อีกครั้ง

สำหรับเราสิ่งนี้ดูเหมือนจะเป็นปัญหาความเสียหายของหน่วยความจำ การรีบูต VPS จะรีโหลด libary ในหน่วยความจำอีกครั้งและตอนนี้ก็ใช้งานได้แล้ว ดังนั้นหากวิธีแก้ปัญหาข้างต้น@cloverไม่ได้ผลให้ลองรีบูตเครื่องของคุณ


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