คำตอบด่วน
SSL: CERTIFICATE_VERIFY_FAILED หมายความว่าอย่างไรกับพร็อกซี?
CERTIFICATE_VERIFY_FAILED หมายถึงไคลเอนต์ของคุณไม่สามารถตรวจสอบใบรับรอง TLS ของเว็บไซต์ได้ ผ่าน CONNECT proxy เช่นเกตเวย์ของ CrawlRelay, TLS ทำงานแบบ end to end ดังนั้น proxy จึงไม่ใช่สาเหตุ ตรวจสอบฝั่งคุณ: CA bundle ที่ล้าสมัย, โปรแกรมแอนตี้ไวรัสหรือตัวกรองไฟร์วอลล์ที่ตรวจสอบ HTTPS, หรือนาฬิการะบบผิดพลาด อย่าซ่อมด้วย verify=False ในสภาพแวดล้อมจริง
SSL: CERTIFICATE_VERIFY_FAILED แบบสั้นๆ
| ข้อผิดพลาด | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| ประเภท | ข้อผิดพลาดใบรับรอง TLS ในไคลเอนต์ |
| ส่งโดย | ไลบรารี TLS ของคุณ เมื่อไม่สามารถตรวจสอบใบรับรองของเว็บไซต์ได้ |
| กำหนดไว้ใน | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| ลองใหม่อีกครั้งไหม? | ไม่ใช่ ให้แก้ไข trust store หรือเครือข่าย |
| ตรวจสอบก่อน | ทดสอบ URL เดียวกันโดยไม่มี proxy บนเครื่องเดียวกัน |
SSL: CERTIFICATE_VERIFY_FAILED หมายความว่าอย่างไร?
ในระหว่างการจับมือ TLS เว็บไซต์จะส่งใบรับรองแบบมีโซ่ ไคลเอนต์ของคุณตรวจสอบกับรายชื่อหน่วยงานที่เชื่อถือได้ (trust store) และตรวจสอบชื่อกับวันหมดอายุ หากตรวจสอบไม่ผ่านข้อใดข้อหนึ่งจะหยุด
สำหรับ CONNECT tunnel proxy จะส่งผ่านการจับมืออย่างไม่ถูกแตะต้อง ใบรับรองที่คุณเห็นจึงเป็นของเว็บไซต์โดยตรง สิ่งที่แทรกใบรับรองของตัวเอง เช่น ซอฟต์แวร์ตรวจสอบ หรือ trust store ที่ล้าสมัยบนเครื่องของคุณ คือสาเหตุทั่วไป
CERTIFICATE_VERIFY_FAILED เป็นอย่างไรใน Python, curl, Node.js และเบราว์เซอร์?
ข้อผิดพลาดเดียวกันนี้แสดงผลแตกต่างกันในแต่ละเครื่องมือ นี่คือข้อความที่ต้องค้นหาในบันทึกของคุณ:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLYหรือSELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - เบราว์เซอร์:
NET::ERR_CERT_AUTHORITY_INVALID
อะไรเป็นสาเหตุของ CERTIFICATE_VERIFY_FAILED?
โอกาสสูงสุดอันดับแรก:
- CA bundle ที่ล้าสมัย เช่น แพ็กเกจ
certifiเก่าใน Python - การตรวจสอบ HTTPS โดยโปรแกรมแอนตี้ไวรัส, ไฟร์วอลล์องค์กร หรือ debugging proxy ที่แสดงใบรับรองของตัวเอง
- นาฬิการะบบผิดพลาด ที่ทำให้ใบรับรองที่ถูกต้องดูเหมือนหมดอายุหรือยังไม่ถึงวันใช้ได้
- เว็บไซต์ที่มีโซ่ใบรับรองขาด เช่น ขาดใบรับรองกลาง
- อิมเมจคอนเทนเนอร์ ที่ไม่มีแพ็กเกจใบรับรอง CA ของระบบ
ฉันวินิจฉัย CERTIFICATE_VERIFY_FAILED ทีละขั้นตอนอย่างไร?
- รันคำขอเดียวกันโดยไม่ใช้ proxy ถ้ายังล้มเหลว แปลว่า proxy ไม่ได้เกี่ยว
- แสดงผู้อนุมัติใบรับรองด้วย
openssl s_clientหรือ curl-v: ถ้าชื่อผู้อนุมัติสัมพันธ์กับแอนตี้ไวรัสหรือไฟร์วอลล์ แปลว่ามีการแทรกแซง - ตรวจสอบวันเวลาระบบ
- อัปเดต CA bundle แล้วทดสอบใหม่
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLฉันจะแก้ไข CERTIFICATE_VERIFY_FAILED อย่างไร?
- อัปเดต
certifi(pip install -U certifi) หรือแพ็กเกจ CA ของระบบ - เพิ่มใบรับรองตรวจสอบของบริษัท ลงใน trust store หากเครือข่ายของคุณตรวจสอบ HTTPS หรือรัน scraper นอกเครือข่ายนั้น
- แก้ไขนาฬิกา ด้วยการซิงค์เวลาเครือข่าย
- ติดตั้งใบรับรอง CA ในอิมเมจคอนเทนเนอร์แบบบาง เช่น แพ็กเกจ
ca-certificates - อย่าปิดการตรวจสอบ ในโค้ดที่ส่งข้อมูลเข้าสู่ระบบหรือเก็บข้อมูลที่สำคัญ
ฉันควรลองใหม่หลังจาก CERTIFICATE_VERIFY_FAILED ไหม?
อย่าลองใหม่: trust store เดิมจะล้มเหลวเหมือนเดิม แก้ไข trust store, นาฬิกา หรือเส้นทางเครือข่ายก่อนแล้วจึงรันใหม่
SSL: CERTIFICATE_VERIFY_FAILED มีผลอย่างไรกับ CrawlRelay?
พอร์ต HTTP ของ CrawlRelay ส่งผ่าน HTTPS ด้วย CONNECT ดังนั้นใบรับรองที่ไคลเอนต์ตรวจจึงเป็นของเว็บไซต์ หากข้อผิดพลาดปรากฏเฉพาะผ่านเกตเวย์นี้และไม่เกิดโดยตรง ติดต่อฝ่ายสนับสนุนพร้อมชื่อโฮสต์เป้าหมายและข้อความผิดพลาดเต็มเพื่อให้เราตรวจสอบฝั่งออกออก
เกตเวย์: gw.crawlrelay.com, พอร์ต 7777 (HTTP, HTTPS ผ่าน CONNECT) และพอร์ต 7778 (SOCKS5). รูปแบบชื่อผู้ใช้: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. ที่เกี่ยวข้อง: SSL: WRONG_VERSION_NUMBER · Connection reset · คู่มือ Python.
SSL: CERTIFICATE_VERIFY_FAILED: คำถามที่นักพัฒนาถาม
proxy ทำให้เกิดข้อผิดพลาด SSL certificate ได้ไหม?
proxy ที่แทรกใบรับรองได้ เพราะมันแสดงใบรับรองของตัวเอง แต่ CONNECT tunnel proxy ไม่ได้ เพราะแค่ส่งข้อมูลที่เข้ารหัสและไม่เห็นเนื้อหาการจับมือ TLS รันคำขอเดียวกันโดยไม่ใช้ proxy หากยังผิดพลาดแปลว่าปัญหาอยู่ที่เครื่องหรือเครือข่ายของคุณ
ใช้ verify=False ปลอดภัยไหมสำหรับการสแครป?
ไม่ใช่เป็นการแก้ไข เพราะมันซ่อนการแทรกแซงและใบรับรองที่เสียหาย และผู้โจมตีบนเส้นทางอาจอ่านหรือเปลี่ยนทราฟฟิกของคุณ รวมถึงโทเค็นและคุกกี้ ใช้เฉพาะสำหรับทดสอบในเครื่องแบบเร่งด่วนเท่านั้น ไม่ควรใช้ในงานที่รันโดยไม่มีคนดูแลหรือส่งข้อมูลเข้าสู่ระบบ
ทำไมถึงล้มเหลวบน Docker แต่ทำงานบนแล็ปท็อปของฉัน?
อิมเมจคอนเทนเนอร์ขนาดเล็กมักไม่มาพร้อมใบรับรอง CA ทำให้ไม่สามารถตรวจสอบใบรับรองได้ ติดตั้งแพ็กเกจ CA ของระบบในอิมเมจ หรือใช้ certifi bundle ใน Python ตรวจสอบด้วยว่านาฬิกาคอนเทนเนอร์ถูกต้อง
ข้อผิดพลาดพร็อกซีอื่นๆ ในเอกสารอ้างอิงนี้
รหัสสถานะ HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
ข้อผิดพลาดของเบราว์เซอร์และไคลเอนต์
ข้อผิดพลาดการเชื่อมต่อและ TLS
พร็อกซีเรซิเดนเชียลที่มีเอกสารอธิบายกรณีล้มเหลว
พร็อกซีเรซิเดนเชียล CrawlRelay จาก US$0.50/GB, ปริมาณข้อมูลที่ไม่หมดอายุ