การขูด: SSL: CERTIFICATE_VERIFY_FAILED ข้อผิดพลาดสำหรับ http://en.wikipedia.org


123

ฉันกำลังฝึกโค้ดจาก 'Web Scraping with Python' และมีปัญหาใบรับรองนี้อยู่เรื่อย ๆ :

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re

pages = set()
def getLinks(pageUrl):
    global pages
    html = urlopen("http://en.wikipedia.org"+pageUrl)
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href'] 
                print(newPage) 
                pages.add(newPage) 
                getLinks(newPage)
getLinks("")

ข้อผิดพลาดคือ:

  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/urllib/request.py", line 1319, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1049)>

แต่ฉันก็ฝึก scrapy เช่นกัน แต่ยังคงได้รับปัญหา: ไม่พบคำสั่ง: scrapy (ฉันลองใช้วิธีแก้ปัญหาออนไลน์ทุกประเภท แต่ไม่มีผล ... น่าผิดหวังจริงๆ)


1
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] การตรวจสอบใบรับรองล้มเหลว: ไม่สามารถรับใบรับรองผู้ออกในเครื่อง (_ssl.c: 1049)>
Catherine4j

1
และ ... โปรดบอกเหตุผลที่อยู่เบื้องหลังข้อผิดพลาดนี้อยากรู้จริงๆ ~~ ขอบคุณ !!
Catherine4j

1
มีคำถามที่มีอยู่ 529 คำถามเกี่ยวกับ SSL: CERTIFICATE_VERIFY_FAILEDโปรดพิจารณาว่าข้อใดเป็นคำตอบของคุณจากนั้นปิดสิ่งนี้ซ้ำ
smci

ตัวอย่างเช่น: python“ SSL: certificate_verify_failed”?
smci

และฉันกำลังจะแสดงความคิดเห็นที่ชัดเจน: คุณเข้าถึงด้วย https แทน http หรือไม่?
smci

คำตอบ:


440

กาลครั้งหนึ่งฉันสะดุดกับปัญหานี้ หากคุณใช้ macOS ให้ไปที่โฟลเดอร์ Macintosh HD> Applications> Python3.6 (หรือ python เวอร์ชันใดก็ตามที่คุณใช้)> ดับเบิลคลิกที่ไฟล์ "Install Certificates.command" : ง


5
โอ้ฉันไม่มีไฟล์ Install Certificates.command บน Mac ของฉัน ... ไม่รู้ทำไม TAT
Catherine4j

24
หากคุณติดตั้ง Python โดยใช้ Homebrew ไฟล์นั้นจะไม่มีอยู่ ทางออกอยู่ที่นี่: stackoverflow.com/a/44649450/412896
Sampo

4
ใครบางคนโปรดทำเครื่องหมายว่านี่เป็นคำตอบที่แก้ไขได้ คุณช่วยฉันประหยัดเวลาและความพยายามอย่างมากเมื่อฉันติดมาก !!
Mark Puchala II

6
ฉันจะทำอย่างไรกับ Windows 10 ไม่มีไฟล์ดังกล่าว
Aakash Basu

6
คำตอบในตำนาน
Nico

43

ในการใช้ ssl ที่ไม่ได้รับการยืนยันคุณสามารถเพิ่มสิ่งนี้ลงในโค้ดของคุณ:

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

2
นี่เป็นสิ่งที่ดีเพราะเหตุใดฉันจึงต้องทำการเปลี่ยนแปลงระบบถ้าสิ่งที่ฉันต้องการเพิ่มคือโค้ดสองบรรทัด
Nagri

1
คำตอบนี้น่าจะพูดถึงว่ารหัสนี้อาจทำให้เกิดปัญหาด้านความปลอดภัยขึ้นอยู่กับว่าผู้ใช้ทำอะไรกับข้อมูลหลังจากที่มีการคัดลอก ..
Michael Altfield

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

1
นี่เป็นการแก้ไขที่ง่าย ขอบคุณ.
รอย

30

วิธีแก้ปัญหานี้:

สิ่งที่คุณต้องทำคือติดตั้งใบรับรอง Python! ปัญหาทั่วไปใน macOS

เปิดไฟล์เหล่านี้:

Install Certificates.command
Update Shell Profile.command

เพียงเรียกใช้สองสคริปต์นี้และคุณจะไม่มีปัญหานี้อีกต่อไป

หวังว่านี่จะช่วยได้!


8
ฉันไม่เห็นไดเร็กทอรี Python ใน Application Dir ของฉันฉันใช้ Anaconda และสร้าง env ใหม่สำหรับ python 3.6 เนื่องจากก่อนหน้านี้ฉันได้ติดตั้ง python 2.7 (ซึ่งดูเหมือนจะไม่ได้สร้างโฟลเดอร์ใน Applications Dir ของฉันด้วย!) .. ไม่พบ Certificates.command ในเครื่อง Mac ของฉัน
Kai

3
สิ่งเหล่านี้ควรจะวิ่งมาจากไหน?
baxx

1
@Azim: แล้วใน Ubuntu ล่ะ?
Betty

21

คำสั่งเทอร์มินัลนี้:

open /Applications/Python\ 3.7/Install\ Certificates.command

พบที่นี่: https://stackoverflow.com/a/57614113/6207266

แก้ไขให้ฉันแล้ว ด้วยการกำหนดค่าของฉัน

pip install --upgrade certifi

ไม่มีผลกระทบ


17

สำหรับผู้ใช้มือใหม่คุณสามารถเข้าไปในโฟลเดอร์ Applications และขยายโฟลเดอร์ Python 3.7 ตอนนี้ให้รัน (หรือดับเบิลคลิก) ที่ Install Certificates.command จากนั้นอัปเดต Shell Profile.command

ใส่คำอธิบายภาพที่นี่


5

สองขั้นตอนได้ผลสำหรับฉัน: - ไปที่โฟลเดอร์ Macintosh HD> Applications> Python3.7 - คลิกที่ "Install Certificates.command"


5

สำหรับใครที่ใช้อนาคอนดาคุณจะต้องติดตั้งcertifiแพ็คเกจดูเพิ่มเติมได้ที่:

https://anaconda.org/anaconda/certifi

ในการติดตั้งพิมพ์บรรทัดนี้ในเทอร์มินัลของคุณ:

conda install -c anaconda certifi

ฉันมีปัญหานี้เหมือนกัน ไม่สามารถสร้างสภาพแวดล้อมได้ ฉันเพิ่งติดตั้ง miniconda3 (macOS) และฉันเห็นใบรับรองติดตั้งแล้ว ('conda list') ..
ไก่

4

ดูที่โพสต์นี้ดูเหมือนว่าสำหรับ Python เวอร์ชันที่ใหม่กว่าจะไม่มีการติดตั้งใบรับรองไว้ล่วงหน้าซึ่งดูเหมือนว่าจะทำให้เกิดข้อผิดพลาดนี้ คุณควรจะสามารถรันคำสั่งต่อไปนี้เพื่อติดตั้งแพ็กเกจ certifi:/Applications/Python\ 3.6/Install\ Certificates.command

โพสต์ 1: ข้อผิดพลาด urllib และ "SSL: CERTIFICATE_VERIFY_FAILED"

โพสต์ 2: ข้อผิดพลาดของ Airbrake : ข้อผิดพลาด urlopen [SSL: CERTIFICATE_VERIFY_FAILED] การตรวจสอบใบรับรองล้มเหลว: ไม่สามารถรับใบรับรองผู้ออกในพื้นที่ได้



2

ฉันแก้ปัญหาไม่ได้น่าเศร้า แต่จัดการเพื่อให้รหัสใช้งานได้ (รหัสเกือบทั้งหมดของฉันมี probelm btw นี้) ปัญหาใบรับรองผู้ออกภายในเกิดขึ้นภายใต้ python3.7 ดังนั้นฉันจึงเปลี่ยนกลับเป็น python2.7 QAQ และสิ่งที่จำเป็นในการเปลี่ยนแปลงรวมถึง "from urllib2 import urlopen" แทนที่จะเป็น "from urllib.request import urlopen" เศร้าจัง ...


2

หากคุณใช้ Mac คุณสามารถค้นหาInstall Certificates.commandบนสปอตไลท์แล้วกด Enter


0

ใช้ไลบรารีคำขอ ลองใช้วิธีนี้หรือเพิ่มhttps://ก่อน URL:

import requests
from bs4 import BeautifulSoup
import re

pages = set()
def getLinks(pageUrl):
    global pages
    html = requests.get("http://en.wikipedia.org"+pageUrl, verify=False).text
    bsObj = BeautifulSoup(html)
    for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
        if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                #We have encountered a new page
                newPage = link.attrs['href']
                print(newPage)
                pages.add(newPage)
                getLinks(newPage)
getLinks("")

ตรวจสอบว่าสิ่งนี้เหมาะกับคุณหรือไม่


0

ฉันเป็นมือใหม่เมื่อเทียบกับผู้เชี่ยวชาญทั้งหมดใน Stack Overflow

ฉันมีสมุดบันทึก jupyter 2 เวอร์ชันที่ใช้งานอยู่ (รุ่นหนึ่งผ่านการติดตั้ง Anaconda Navigator ใหม่และอีกรุ่นหนึ่งผ่าน ????) ฉันคิดว่านี่เป็นเพราะ Anaconda ถูกติดตั้งเป็นการติดตั้งในเครื่องบน Mac ของฉัน (ตามคำแนะนำของ Anaconda)

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

อย่างไรก็ตามฉันไม่แน่ใจเพราะฉันเพิ่งเรียนรู้จากการลองผิดลองถูก!

ฉันทำตามคำสั่งเทอร์มินัล:

conda install -c anaconda certifi 

(ตามที่ระบุไว้ข้างต้น แต่ไม่ได้ผล)

python 3.7 ของฉันติดตั้งบน OS Catalina10.15.3 ใน:

  • /Library/Python/3.7/site-packages AND
  • ~ / Library / Python / 3.7 / lib / python / ไซต์แพ็คเกจ

ใบรับรองอยู่ที่:

  • ~ / Library / Python / 3.7 / lib / python / site-Packages / certifi-2019.11.28.dist-info

ฉันพยายามค้นหา Install Certificate.command ... แต่ไม่พบผ่านการดูโครงสร้างไฟล์ ... ไม่ใช่ในแอปพลิเคชัน ...

ในที่สุดฉันก็ติดตั้งโดยค้นหาผ่าน Spotlight (ตามที่มีคนแนะนำด้านบน) และดับเบิลคลิกโดยอัตโนมัติและติดตั้งใบรับรอง ANOTHER ในโฟลเดอร์เดียวกับ:

  • ~ / ไลบรารี / Python / 3.7 / lib / python / ไซต์แพ็คเกจ /

ไม่มีข้อผิดพลาดใด ๆ ที่สามารถแก้ไขได้สำหรับฉัน ... ฉันยังคงได้รับข้อผิดพลาดเดิม

ดังนั้นฉันจึงแก้ปัญหาโดย:

  1. ปิดสมุดบันทึก jupyter ของฉัน
  2. เปิด Anaconda Navigator
  3. เปิดสมุดบันทึก jupyter ผ่าน Navigator GUI (แทนที่จะเปิดผ่าน Terminal)
  4. เปิดสมุดบันทึกของฉันและเรียกใช้รหัส

ฉันไม่สามารถบอกคุณได้ว่าทำไมถึงได้ผล แต่มันช่วยแก้ปัญหาให้ฉันได้

ฉันแค่อยากช่วยใครบางคนไม่ให้ยุ่งยากในครั้งต่อไป ถ้ามีใครสามารถบอกได้ว่าทำไมมันถึงได้ผลมันจะยอดเยี่ยมมาก

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


0

สำหรับฉันปัญหาคือฉันตั้งค่าREQUESTS_CA_BUNDLEในไฟล์.bash_profile

/Users/westonagreene/.bash_profile:
...
export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/cert.pem
...

เมื่อฉันตั้งค่าREQUESTS_CA_BUNDLEเป็นว่าง (เช่นลบออกจาก.bash_profile) ให้requestsทำงานอีกครั้ง

export REQUESTS_CA_BUNDLE=""

ปัญหาจะปรากฏเฉพาะเมื่อดำเนินการ python requestsผ่าน CLI (Command Line Interface) ถ้าฉันรันrequests.get(URL, CERT)มันแก้ไขได้ดี

Mac OS Catalina (10.15.6) Pyenv จาก 3.6.11.2 ข้อความแสดงข้อผิดพลาดที่ฉันได้รับ:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

คำตอบของฉันที่อื่น: https://stackoverflow.com/a/64151964/4420657


0

ฉันใช้ Debian 10 Buster และลองดาวน์โหลดไฟล์ด้วย youtube-dl และได้รับข้อผิดพลาดนี้: sudo youtube-dl -k https://youtu.be/uscis0CnDjk

[youtube] uscis0CnDjk: การดาวน์โหลดหน้าเว็บข้อผิดพลาด: ไม่สามารถดาวน์โหลดหน้าเว็บ: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] การตรวจสอบใบรับรองล้มเหลว: ไม่สามารถรับใบรับรองผู้ออกในเครื่อง (_ssl.c: 1056)> (เกิดจาก URLError (SSLCertVerificationError (1, ') [SSL: CERTIFICATE_VERIFY_FAILED] การตรวจสอบใบรับรองล้มเหลว: ไม่สามารถรับใบรับรองผู้ออกในประเทศ (_ssl.c: 1056) ')))

ใบรับรองที่มี python2 และ python3.8 ได้รับการติดตั้งอย่างถูกต้อง แต่ฉันยังคงได้รับข้อผิดพลาดเดียวกัน ในที่สุด (ซึ่งไม่ใช่วิธีแก้ปัญหาที่ดีที่สุด แต่สำหรับฉันคือกำจัดการตรวจสอบใบรับรองเนื่องจากมีให้เป็นตัวเลือกใน youtube-dl) ด้วยคำสั่งนี้ sudo youtube-dl -k --no-check-certificate https://youtu.be/uscis0CnDjk



-1

วิธีนี้จะได้ผล ตั้งค่าตัวแปรสภาพแวดล้อม PYTHONHTTPSVERIFY เป็น 0

  • โดยพิมพ์คำสั่ง linux:
export PYTHONHTTPSVERIFY = 0

หรือ

  • ใช้ในรหัส python:
import os
os.environ["PYTHONHTTPSVERIFY"] = "0"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.