Curl: ปัญหาใบรับรอง SSL ตรวจสอบว่าใบรับรอง CA นั้นตกลง
7 เมษายน 2549
เมื่อเปิด URL ที่ปลอดภัยด้วย Curl คุณอาจได้รับข้อผิดพลาดดังต่อไปนี้:
ปัญหาใบรับรอง SSL ตรวจสอบว่าใบรับรอง CA นั้นตกลง
ฉันจะอธิบายว่าทำไมข้อผิดพลาดและสิ่งที่คุณควรทำเกี่ยวกับมัน
วิธีที่ง่ายที่สุดในการกำจัดข้อผิดพลาดคือการเพิ่มสองบรรทัดต่อไปนี้ในสคริปต์ของคุณ วิธีการนี้ทำให้เกิดความเสี่ยงด้านความปลอดภัย
//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);
ลองดูว่าพารามิเตอร์สองตัวนี้ทำอะไร การอ้างอิงคู่มือ
CURLOPT_SSL_VERIFYHOST : 1 เพื่อตรวจสอบการมีอยู่ของชื่อทั่วไปในใบรับรองเพียร์ SSL 2 เพื่อตรวจสอบการมีอยู่ของชื่อสามัญและตรวจสอบว่าตรงกับชื่อโฮสต์ที่ให้ไว้
CURLOPT_SSL_VERIFYPEER : FALSE เพื่อหยุด CURL จากการตรวจสอบใบรับรองของเพื่อน สามารถระบุใบรับรองสำรองเพื่อตรวจสอบกับด้วยตัวเลือก CURLOPT_CAINFO หรือสามารถระบุไดเรกทอรีใบรับรองด้วยตัวเลือก CURLOPT_CAPATH CURLOPT_SSL_VERIFYHOST อาจต้องเป็น TRUE หรือ FALSE หาก CURLOPT_SSL_VERIFYPEER ถูกปิดใช้งาน (ค่าเริ่มต้นคือ 2) การตั้งค่า CURLOPT_SSL_VERIFYHOST เป็น 2 (นี่คือค่าเริ่มต้น) จะรับประกันว่าใบรับรองที่นำเสนอให้คุณมี 'ชื่อสามัญ' ที่ตรงกับ URN ที่คุณใช้ในการเข้าถึงทรัพยากรระยะไกล นี่เป็นการตรวจสุขภาพ แต่ไม่รับประกันว่าโปรแกรมของคุณจะไม่ได้รับการถอดรหัส
ป้อน 'คนที่อยู่ตรงกลาง'
โปรแกรมของคุณอาจทำให้เข้าใจผิดในการพูดคุยกับเซิร์ฟเวอร์อื่นแทน สิ่งนี้สามารถทำได้ผ่านกลไกต่าง ๆ เช่น dns หรือ arp พิษ (นี่คือเรื่องราวของอีกวัน) ผู้บุกรุกสามารถลงนามในใบรับรองด้วยตัวเองด้วยชื่อ 'comon' ที่โปรแกรมของคุณคาดหวัง การสื่อสารจะยังคงถูกเข้ารหัส แต่คุณจะมอบความลับให้ผู้หลอกลวง การโจมตีแบบนี้เรียกว่า 'คนที่อยู่ตรงกลาง'
เอาชนะ 'คนที่อยู่ตรงกลาง'
เราต้องยืนยันว่าใบรับรองที่นำเสนอนั้นดีสำหรับของจริง เราทำสิ่งนี้โดยเปรียบเทียบกับใบรับรองที่เราเชื่อถือ * ที่เชื่อถือได้
หากทรัพยากรระยะไกลได้รับการคุ้มครองโดยใบรับรองที่ออกโดยหนึ่งใน CA หลักเช่น Verisign, GeoTrust และคณะคุณสามารถเปรียบเทียบกับชุดใบรับรอง CA ของ Mozilla ได้อย่างปลอดภัยซึ่งคุณสามารถรับได้จาก
http://curl.haxx.se/docs/caextract .html
บันทึกไฟล์cacert.pem
ไว้ในเซิร์ฟเวอร์ของคุณและตั้งค่าตัวเลือกต่อไปนี้ในสคริปต์ของคุณ
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_setopt ($ch, CURLOPT_CAINFO, "pathto/cacert.pem");