ข้อผิดพลาด urllib และ“ SSL: CERTIFICATE_VERIFY_FAILED”


279

ฉันได้รับข้อผิดพลาดต่อไปนี้:

Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in        __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in  run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

นี่คือรหัสที่ทำให้เกิดข้อผิดพลาดนี้:

if input.startswith("!web"):
    input = input.replace("!web ", "")      
    url = "https://domainsearch.p.mashape.com/index.php?name=" + input
    req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
    info = urllib2.urlopen(req).read()
    Message.Chat.SendMessage ("" + info)

API ที่ฉันใช้ต้องการให้ฉันใช้ HTTPS ฉันจะทำให้ผ่านการตรวจสอบได้อย่างไร


2
ไม่มีอะไรผิดปกติกับ URL และสามารถตรวจสอบได้สำเร็จด้วยใบรับรองที่เชื่อถือได้ทั่วไป ดังนั้นคุณไม่ควรพยายามหลีกเลี่ยงการตรวจสอบใบรับรอง แต่ควรแก้ไข คุณใช้ไพ ธ อนรุ่นใด
Steffen Ullrich

นี้อาจจะเกี่ยวข้องกับstackoverflow.com/a/27826829/3081018 เซิร์ฟเวอร์ใช้ลูกโซ่ใบรับรองประเภทเดียวกันกับหลายเส้นทางที่ไว้วางใจ ดูที่ cafile ที่คุณอาจต้องใช้สำหรับการตรวจสอบ
Steffen Ullrich

7
ข้อผิดพลาดนี้เกิดขึ้นกับ Python 3.5 หลังจากอัปเกรดเป็นโยเซมิตี
pyCthon

2
สิ่งนี้จะอธิบายสถานการณ์ access.redhat.com/articles/2039753
Charlie Burns

4
"ฉันจะทำให้ผ่านการตรวจสอบได้อย่างไร" เป็นคำถามที่ผิด คุณควรถามวิธีการตรวจสอบใบรับรองที่ได้รับจากโดเมน
jww

คำตอบ:


296

หากคุณเพียงแค่ต้องการที่จะตรวจสอบบายพาสคุณสามารถสร้างใหม่SSLContext โดยค่าเริ่มต้นบริบทที่สร้างขึ้นใหม่ใช้CERT_NONE

ระวังด้วยสิ่งนี้ตามที่ระบุไว้ในส่วน17.3.7.2.1

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

แต่ถ้าคุณต้องการให้มันทำงานตอนนี้ด้วยเหตุผลอื่นคุณสามารถทำสิ่งต่อไปนี้ได้คุณจะต้องimport ssl:

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

สิ่งนี้จะทำให้เกิดปัญหาของคุณ แต่คุณไม่ได้แก้ปัญหาใด ๆ แต่คุณจะไม่เห็น[SSL: CERTIFICATE_VERIFY_FAILED]เพราะตอนนี้คุณไม่ได้ตรวจสอบใบรับรอง!

เพื่อเพิ่มความดังกล่าวข้างต้นถ้าคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับเหตุผลที่คุณจะเห็นปัญหาเหล่านี้คุณจะต้องมีลักษณะที่PEP 476

PEP นี้เสนอให้เปิดใช้งานการตรวจสอบลายเซ็นใบรับรอง X509 รวมถึงการตรวจสอบชื่อโฮสต์สำหรับไคลเอนต์ HTTP ของ Python โดยค่าเริ่มต้นขึ้นอยู่กับการไม่เข้าร่วมตามการโทรแต่ละครั้ง การเปลี่ยนแปลงนี้จะนำไปใช้กับ Python 2.7, Python 3.4 และ Python 3.5

มีการเลือกไม่แนะนำซึ่งไม่เหมือนคำแนะนำของฉันด้านบน:

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

นอกจากนี้ยังมีตัวเลือกที่ท้อแท้อย่างมากผ่านการจับลิงซึ่งคุณไม่เห็นบ่อย ๆ ในงูหลาม:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

ซึ่งจะแทนที่ฟังก์ชันเริ่มต้นสำหรับการสร้างบริบทด้วยฟังก์ชันเพื่อสร้างบริบทที่ไม่ผ่านการตรวจสอบ

โปรดทราบด้วยสิ่งนี้ตามที่ระบุไว้ใน PEP:

คำแนะนำนี้มีวัตถุประสงค์หลักที่ผู้ดูแลระบบที่ต้องการปรับใช้ Python เวอร์ชันใหม่ที่ใช้ PEP นี้ในสภาพแวดล้อมดั้งเดิมที่ยังไม่รองรับการตรวจสอบใบรับรองในการเชื่อมต่อ HTTPS ตัวอย่างเช่นผู้ดูแลระบบอาจยกเลิกโดยการเพิ่ม monkeypatch ด้านบนเพื่อ sitecustomize.py ใน Standard Operating Environment สำหรับ Python แอปพลิเคชันและไลบรารีไม่ควรทำให้กระบวนการเปลี่ยนแปลงนี้กว้าง (ยกเว้นอาจตอบสนองต่อการตั้งค่าที่ควบคุมโดยผู้ดูแลระบบ)

หากคุณต้องการอ่านบทความเกี่ยวกับสาเหตุที่การตรวจสอบความถูกต้องของซอฟต์แวร์ไม่ดีคุณสามารถค้นหาได้ที่นี่ !


1
ดังนั้นหากข้อผิดพลาดนี้ทำให้ฉันsetup.py uploadไม่สามารถใช้วิธีแก้ไขได้
pyCthon

5
ssl._create_default_https_context = ssl._create_unverified_context สิ่งนี้ใช้ได้สำหรับฉันตามที่ Noelkd พูดถึงตอนจบ เนื่องจากเราเป็นไซต์อินทราเน็ตสำหรับเครื่องพิมพ์ HP ... ใช้เพื่อการขูด ... เราไม่มีปัญหากับการใช้วิธีนี้
ihightower

วิธีแรกของคุณคือการตรวจสอบความถูกต้องแบบบายพาสอย่างน้อยที่สุดที่ต้องการ เหตุใดจึงเป็นใบรับรองที่ตรวจสอบความถูกต้องจริงที่ไม่ได้อยู่ในรายการก่อน
jww

1
สิ่งนี้สามารถเกิดขึ้นได้หากคุณมีรุ่นเก่าของ openSSL ดังนั้นสำหรับฉันสิ่งที่ใช้ได้ผลคือการอัปเดตเป็นรุ่นล่าสุดcertifi และอัปเดต openssl บนกล่อง
myusuf3

1
context คือสิ่งที่ฉันต้องการ
prayagupd

382

นี่ไม่ใช่วิธีการแก้ปัญหาเฉพาะของคุณ แต่ฉันกำลังวางไว้ที่นี่เพราะเธรดนี้เป็นผลการค้นหาอันดับต้น ๆ ของ Google สำหรับ "SSL: CERTIFICATE_VERIFY_FAILED" และมันทำให้ฉันตกอยู่ในการไล่ล่า

หากคุณติดตั้ง Python 3.6 บน OSX และได้รับข้อผิดพลาด "SSL: CERTIFICATE_VERIFY_FAILED" เมื่อพยายามเชื่อมต่อกับเว็บไซต์ https: // อาจเป็นเพราะ Python 3.6 บน OSX ไม่มีใบรับรองเลยและไม่สามารถตรวจสอบ SSL ใด ๆ ได้ สัมพันธ์ นี่คือการเปลี่ยนแปลงสำหรับ 3.6 บน OSX และต้องมีขั้นตอนหลังการติดตั้งซึ่งติดตั้งcertifiแพคเกจของใบรับรอง เอกสารนี้มีไว้ใน ReadMe ซึ่งคุณควรดูได้ที่/Applications/Python\ 3.6/ReadMe.rtf

ReadMe จะให้คุณเรียกใช้สคริปต์หลังการติดตั้งซึ่งเพิ่งติดตั้งcertifi:/Applications/Python\ 3.6/Install\ Certificates.command

บันทึกประจำรุ่นมีข้อมูลเพิ่มเติม: https://www.python.org/downloads/release/python-360/


105
เรียกใช้โดยตรง / Applications / Python \ 3.6 / Install \ Certificates.com และแก้ไขปัญหาของฉันใน OSX ขอบคุณ
muyong

2
ฉันใช้ OS X El Capitan 10.11.6, Python 3.6.0 และโซลูชันนี้ทำงานได้อย่างสมบูรณ์
y2knoproblem

2
ฉันใช้ macOS Sierra 10.12.5, Python 3.6.1 และโซลูชันนี้ทำงานได้อย่างสมบูรณ์
James

4
นี้แก้ไขให้ฉัน/Applications/Python\ 3.7/Install\ Certificates.command ทำงานโดยตรงในterminal! ขอบคุณ @CraigGlennie & @muyong ฉันขอขอบคุณout-of-the-box-thinkingสำหรับการวางที่นี่!
JayRizzo

6
Python 3.7 บน macOS Mojave: มันไม่ทำงานที่นี่ ฉันได้ถอนการติดตั้ง / ติดตั้งใหม่ / เรียกใช้ใบรับรองการติดตั้งรีบูตเครื่อง ฯลฯ ไม่สามารถใช้งานได้
Thomas

71

หากต้องการขยายคำตอบของ Craig Glennie:

ใน Python 3.6.1 บน MacOs Sierra

การป้อนสิ่งนี้ในเทอร์มินัล bash ช่วยแก้ปัญหาได้:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command

3
ลองsudo /Applications/Python\ 3.6/Install\ Certificates.commandถ้าสิทธิ์ถูกปฏิเสธ
KingKongCoder

นี่ไม่ได้ช่วยแก้ไขปัญหาใน Python 3.6 -1
hyperum

1
หากการใช้บรรทัดคำสั่งทำให้คุณประหลาดใจ (อาจไม่ใช่ถ้าคุณอยู่ที่นี่ แต่เฮ้) คุณสามารถค้นหาโฟลเดอร์ Applications (หรือเทียบเท่ากับระบบปฏิบัติการอื่น ๆ ) ที่ Python สร้างขึ้นในการติดตั้งจากนั้นเปิดสคริปต์โดยดับเบิลคลิก ชื่อเฉพาะของโฟลเดอร์จะขึ้นอยู่กับเวอร์ชันของ Python ที่คุณติดตั้ง
Erdős-Bacon

ทำงานเหมือนเสน่ห์ของ Python 3.7.3 ขอบคุณ.
klbytec

ขอบคุณ ฉันค้นหาวิธีแก้ปัญหาทั้งหมด 100 รายการและคุณทำงาน
nnd

43

บน Windows, ?\lib\site-packages\certifi\cacert.pemงูใหญ่ไม่ได้ดูใบรับรองระบบจะใช้มันอยู่ที่ตัวเอง

ทางออกสำหรับปัญหาของคุณ:

  1. ดาวน์โหลดใบรับรองการตรวจสอบความถูกต้องของโดเมนเป็นไฟล์ * .crt หรือ * pem
  2. เปิดไฟล์ในตัวแก้ไขและคัดลอกเนื้อหาไปยังคลิปบอร์ด
  3. ค้นหาcacert.pemตำแหน่งของคุณ:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. แก้ไขcacert.pemไฟล์และวางใบรับรองการตรวจสอบความถูกต้องของโดเมนของคุณที่ท้ายไฟล์
  5. บันทึกไฟล์และเพลิดเพลินกับคำขอ!

6
lib\site-packages\certifi\cacert.pemไม่มีอยู่ใน Python 2.7.10 และคำถามนั้นurllib2ไม่เกี่ยวกับrequests
Kevin Smyth

2
ทางออกที่ดีที่สุดจนถึง twitter API ใช้ใบรับรอง DigiCert ซึ่งไม่ได้อยู่ในไฟล์ cacert.pem python ของฉัน ฉันเพิ่มที่นั่นและ VOILA!
digz6666

2
ทำงานบนเดเบียน /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pemสำหรับบันทึกเส้นทางไฟล์บนระบบของฉันคือ: ขอบคุณ!
ofavre

น่าเสียดายที่คำขอไพ ธ อนไม่ได้ใช้ CA trust store ของระบบปฏิบัติการใด ๆ github.com/requests/requests/issues/2966 คุณจะต้องตั้ง REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514
jamshid

ใช้งานได้กับ Windows 10, Python 3.6, กับ Google และ Twitter API และโมดูลคำขอโดยทั่วไป
brittenb

36

โซลูชันของฉันสำหรับ Mac OS X:

1) อัปเกรดเป็น Python 3.6.5 โดยใช้ตัวติดตั้ง Python ของแอพที่ดาวน์โหลดมาจากเว็บไซต์ภาษา Python อย่างเป็นทางการhttps://www.python.org/downloads/

ฉันพบว่าตัวติดตั้งนี้กำลังดูแลการอัปเดตลิงก์และ symlink สำหรับ Python ใหม่ดีกว่า homebrew

2) ติดตั้งใบรับรองใหม่โดยใช้ "./Install Certificates.command" ซึ่งอยู่ในไดเรกทอรี Python 3.6 ที่รีเฟรช

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"

ทำงานเหมือนมีเสน่ห์ใน Mac OS X
มนู

31

คุณสามารถลองเพิ่มสิ่งนี้ลงในตัวแปรสภาพแวดล้อมของคุณ:

PYTHONHTTPSVERIFY=0 

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


17
ฉันสงสัยว่าการปิดใช้งานการตรวจสอบ HTTP ทั้งหมดสำหรับไพ ธ อนนั้นค่อนข้างมากเกินไปที่จะจัดการกับข้อผิดพลาดเดียวในการตรวจสอบ มีหลายกรณีที่หนึ่งอาจต้องการการตรวจสอบโดยค่าเริ่มต้น
trevorKirkby

ทำงานให้ฉันใน Windows Server 2016 บน python 2.7.13 ปกติฉันไม่มีงูเหลือมติดตั้งบนเซิร์ฟเวอร์ windows แต่จำเป็นต้องใช้สำหรับการอัพเกรด vCenter ด้วยการโยกย้าย Nexus 1000v เป็น VDS และนี่เป็นเพียงการแก้ไขปัญหากับใบรับรอง vCenter ที่ลงชื่อด้วยตนเองในขณะนั้น (จะใช้ VMCA และใบรับรองที่ถูกต้องใน สภาพแวดล้อมที่อัพเกรดแล้ว) ผมมีโชคไม่ได้รับใบรับรองที่จะได้รับการยอมรับโดยการแก้ไข cacert.pem ในแพคเกจคำขอหลาม
คริสโต Thorjussen

3
นอกจากนี้ฉันตั้งค่าตัวแปรโดยตรงในหน้าต่างบรรทัดคำสั่งก่อนที่จะเรียกใช้สคริปต์ดังนั้นมันจะไม่ปิดการใช้งานการตรวจสอบทั้งหมดเช่น @ บางคนหรือคนอื่น ๆ ที่กลัวซึ่งฉันก็จะไม่แนะนำ
Christopher Thorjussen

มันเหมาะสำหรับกรณีการใช้งานของฉัน: การทดสอบ ฉันจะไม่ทำสิ่งนี้กับการผลิต แต่สำหรับการทดสอบที่ไม่มีส่วนเกี่ยวข้องกับ SSL นั่นเป็นตัวเลือกที่ยอดเยี่ยม
sorin

ขอบคุณวิธีแก้ปัญหานี้ทำเพื่อฉัน: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello

28

ผมมีปัญหาที่คล้ายกัน แต่ผมใช้urllib.request.urlopenในPython 3.4, 3.5 และ 3.6 (นี่เป็นส่วนหนึ่งของ Python 3 ที่เทียบเท่าได้urllib2ตามหมายเหตุที่ส่วนหัวของurllib2หน้าเอกสารของ Python 2 )

ทางออกของฉันคือpip install certifiการติดตั้งcertifiซึ่งมี:

... คอลเลกชัน curated อย่างระมัดระวังสำหรับการตรวจสอบความน่าเชื่อถือของใบรับรอง SSL ในขณะที่ยืนยันตัวตนของโฮสต์ TLS

จากนั้นในรหัสของฉันที่ฉันเพิ่งมี:

import urllib.request as urlrq

resp = urlrq.urlopen('https://example.com/bar/baz.html')

ฉันแก้ไขเป็น:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

ถ้าฉันอ่านurllib2.urlopenเอกสารอย่างถูกต้องมันก็มีcafileข้อโต้แย้ง ดังนั้นurllib2.urlopen([...], certifi.where())อาจใช้กับ Python 2.7 ได้เช่นกัน


UPDATE (2020/01/01):ในฐานะที่เป็นของงูใหญ่ 3.6 อาร์กิวเมนต์ได้เลิกกับอาร์กิวเมนต์ควรจะระบุไว้แทน ฉันพบว่าสิ่งต่อไปนี้สามารถทำงานได้ดีบน 3.5 ถึง 3.8:cafileurlopencontext

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))

1
load_verify_locationsแปรรูปตัวอย่างและผลตอบแทนSSLContext Noneคุณควรใช้context=ssl.create_default_context(cafile=certifi.where())แทน ดูsslเอกสารสำหรับข้อมูลเพิ่มเติม
ostrokach

1
@ ostrokach Huh ฉันลองแบบนี้ แต่ฉันต้องใช้sslฟังก์ชั่นที่ผิด ดูการแก้ไข ตกลง?
hBy2Py

13
import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

นำมาจากที่นี่https://gist.github.com/michaelrice/a6794a017e349fc65d01


ทดสอบวิธีแก้ปัญหานี้ในสภาพแวดล้อมของเจนกินส์, สภาพแวดล้อมส่วนตัว, งานนี้!
rapport89

2
สิ่งนี้ไม่ปลอดภัยอย่างยิ่งเนื่องจากผ่านการตรวจสอบใบรับรองทั้งหมดใช้ความเสี่ยงของคุณเองและเพื่อความรักของใครก็ตามที่ไม่ได้ใช้สิ่งนี้ในรหัสการผลิต
dragon788

ขอบคุณ ในที่สุดมันก็ทำงานได้ ไม่จำเป็นว่าจะต้องติดตั้ง Python 3.6 ใต้ / Applications บน Mac OS นี่ควรเป็นคำตอบที่ยอมรับได้
Biranchi

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

10

เช่นเดียวกับที่ฉันเขียนในความคิดเห็นปัญหานี้อาจเกี่ยวข้องกับคำตอบ SOนี้

กล่าวโดยย่อ: มีหลายวิธีในการตรวจสอบใบรับรอง การตรวจสอบที่ใช้โดย OpenSSL เข้ากันไม่ได้กับใบรับรองรูทที่เชื่อถือได้ที่คุณมีในระบบของคุณ Python ใช้ OpenSSL

คุณสามารถลองรับใบรับรองที่หายไปสำหรับผู้ออกใบรับรองหลักสาธารณะ Verisign Class 3แล้วใช้cafileตัวเลือกตามเอกสารของ Python :

urllib2.urlopen(req, cafile="verisign.pem")

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

8

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

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs

7

ฉันต้องการเพิ่มคำตอบอื่น ๆ เพราะเหมือนกับเครกเกล็นนี่ฉันไปล่าห่านป่าเพราะมีบทความมากมายที่อ้างถึงปัญหานี้ในเว็บ

ฉันกำลังใช้ MacPorts และสิ่งที่ฉันคิดว่าเป็นปัญหางูหลามในความเป็นจริงแล้วเป็นปัญหาของ MacPorts: มันไม่ได้ติดตั้งใบรับรองหลักด้วยการติดตั้ง openssl การแก้ปัญหาคือการport install curl-ca-bundleเป็นที่กล่าวถึงในบล็อกโพสต์นี้


5

ฉันได้พบนี้ในรอบที่นี่

ฉันพบวิธีแก้ไขปัญหานี้ให้แทรกรหัสนี้ที่จุดเริ่มต้นของไฟล์ต้นฉบับของคุณ:

import ssl

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

รหัสนี้ทำการยกเลิกการตรวจสอบเพื่อให้การรับรอง SSL ไม่ได้รับการตรวจสอบ


ดูวิดีโอนี้มันช่วยฉันมากที่จะเข้าใจว่า SSL คืออะไร URL วิดีโอ: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala

4

สำหรับPython 3.4+บนCentos 6/7, Fedoraเพียงติดตั้ง CA ที่เชื่อถือได้ด้วยวิธีนี้:

  1. คัดลอก CA.crt ไปยัง /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract

2
อาจเป็นคำถามที่โง่ แต่ CA.crt คืออะไรและฉันจะหาได้ที่ไหน
บัล

4

ทางออกสำหรับอนาคอนด้า

การตั้งค่าของฉันคือ Anaconda Python 3.7 บน MacOS ด้วยพรอกซี เส้นทางนั้นแตกต่างกัน

  • นี่คือวิธีที่คุณได้รับเส้นทางใบรับรองที่ถูกต้อง :
import ssl
ssl.get_default_verify_paths()

สิ่งที่ระบบของฉันผลิต

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
 openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
 openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

เมื่อคุณทราบว่าใบรับรองไปที่ใดคุณจะต่อกันใบรับรองที่ใช้โดยพร็อกซีกับส่วนท้ายของไฟล์นั้น

ฉันได้ตั้งค่า conda ให้ทำงานกับพร็อกซีของฉันแล้วโดยเรียกใช้:

conda config --set ssl_verify <pathToYourFile>.crt

หากคุณจำไม่ได้ว่าใบรับรองของคุณอยู่ที่ไหนคุณสามารถค้นหาได้ใน~/.condarc:

ssl_verify: <pathToYourFile>.crt

ตอนนี้เชื่อมต่อไฟล์นั้นกับส่วนท้าย/miniconda3/ssl/cert.pem และคำขอควรทำงานโดยเฉพาะอย่างยิ่งsklearn.datasetsควรทำงานได้

Caveats เพิ่มเติม

โซลูชันอื่นไม่ทำงานเนื่องจากการตั้งค่า Anaconda แตกต่างกันเล็กน้อย:

  • เส้นทางApplications/Python\ 3.Xไม่มีอยู่จริง

  • เส้นทางที่ให้ไว้โดยคำสั่งด้านล่างนี้คือเส้นทางที่ผิด

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH

3

ฉันแขวนหัวของฉันด้วยความละอายเพราะฉันมีปัญหาเดียวกันยกเว้นว่าในกรณีของฉัน URL ที่ฉันกดปุ่มนั้นถูกต้องใบรับรองก็ใช้ได้ สิ่งที่ไม่ถูกต้องคือการเชื่อมต่อกับเว็บ ฉันไม่สามารถเพิ่มรายละเอียดพร็อกซีลงในเบราว์เซอร์ (IE ในกรณีนี้) สิ่งนี้หยุดกระบวนการตรวจสอบไม่ให้เกิดขึ้นอย่างถูกต้อง
เพิ่มในรายละเอียดพร็อกซี่และงูใหญ่ของฉันก็มีความสุขมาก


1
อย่าเอาหัวของคุณไปด้วยความละอายเพราะลืมอะไรบางอย่างไปแล้วคิดออกแล้วแบ่งปันใครบางคนอาจพบว่ามีประโยชน์ การใช้ IE แม้ว่า ... shame: p
Davos

3

Python 2.7.12 (ค่าเริ่มต้น 29 ก.ค. 2559, 15:26:22) แก้ไขปัญหาที่กล่าวถึง ข้อมูลนี้อาจช่วยคนอื่นได้


3
ผมพบมันใน 2.7.12 บน Mac ใช้ห้องสมุด urllib2 ใช้ห้องสมุด requets ดูเหมือนดี แต่
marcadian

การติดตั้งและการใช้ @marcadian certifiซึ่งเห็นได้ชัดคือถูของใบรับรองที่จัดขึ้นโดยrequests, แก้ไขปัญหาสำหรับฉันในหลาม 3.4-3.6
hBy2Py

3

ฉันประหลาดใจที่คำแนะนำเหล่านี้ไม่ได้แก้ปัญหาของฉัน อย่างไรก็ตามการวินิจฉัยถูกต้อง (BTW ฉันใช้ Mac และ Python3.6.1) ดังนั้นเพื่อสรุปส่วนที่ถูกต้อง:

  • สำหรับ Mac Apple กำลังปล่อย OpenSSL
  • ขณะนี้ Python ใช้ชุด CA Root Certificate ของตัวเอง
  • การติดตั้ง Binary Python จัดทำสคริปต์เพื่อติดตั้งใบรับรอง CA Root Python ต้องการ ("/ Applications / Python 3.6 / ติดตั้ง Certificates.command")
  • อ่าน "/ Applications / Python 3.6 / ReadMe.rtf" เพื่อดูรายละเอียด

สำหรับฉันแล้วสคริปต์ไม่ทำงานและการติดตั้ง certifi และ openssl ทั้งหมดนั้นก็ไม่สามารถแก้ไขได้เช่นกัน อาจเป็นเพราะฉันมีการติดตั้ง python 2 และ 3 หลายตัวรวมถึง virtualenv จำนวนมาก ในตอนท้ายฉันต้องแก้ไขด้วยมือ

pip install certifi   # for your virtualenv
mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl
cp -a <your virtualenv>/site-package/certifi/cacert.pem \
  /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

หากยังคงล้มเหลวคุณ จากนั้นติดตั้ง OpenSSL ใหม่อีกครั้ง

port install openssl

2

เช่นเดียวกับคุณฉันใช้ python 2.7 กับ iMac เก่าของฉัน (OS X 10.6.8) ฉันก็พบปัญหาด้วยเช่นกันโดยใช้ urllib2.urlopen:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

โปรแกรมของฉันทำงานได้ดีโดยไม่มีปัญหาใบรับรอง SSL และ suddently (หลังจาก dowloading โปรแกรม) พวกเขาล้มเหลวด้วยข้อผิดพลาด SSL นี้

ปัญหาคือเวอร์ชันของ python ที่ใช้:

  1. ไม่มีปัญหากับhttps://www.python.org/downloadsและ python-2.7.9-macosx10.6.pkg

  2. ปัญหากับหนึ่ง instaled โดยเครื่องมือ Homebrew : "ชงติดตั้งหลาม" รุ่นที่อยู่ใน / usr / local / bin

บทที่เรียกว่าCertificate verification and OpenSSL [CHANGED for Python 2.7.9]ในการ/Applications/Python 2.7/ReadMe.rtfอธิบายปัญหาที่มีรายละเอียดมากมาย

ดังนั้นตรวจสอบดาวน์โหลดและใส่ PATH ในเวอร์ชันที่ถูกต้องของไพ ธ อน


2

Python 2.7 บน Amazon EC2 พร้อม centOS 7

ฉันต้องตั้งค่าตัวแปร env SSL_CERT_DIRให้ชี้ไปca-bundleที่ซึ่งตั้งอยู่ที่/etc/ssl/certs/ca-bundle.crt


คุณได้รับคำตอบที่พาฉันไปสู่เส้นทางที่ถูกต้องสำหรับฉัน บน Ubuntu ผมต้องตั้งSSL_CERT_DIRไป/etc/ssl/certsและยังทำให้แน่ใจว่าca-certificatesแพคเกจติดตั้งและทันสมัย
นอร์แมน Breau




1

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เนื่องจากrequestsและurllib3รุ่นที่เข้ากันไม่ได้ให้ข้อผิดพลาดต่อไปนี้ระหว่างการติดตั้ง:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

ทำเคล็ดลับ


1

อีกวิธีการแก้งู ฉันได้รับ CERTIFICATE_VERIFY_FAILED ในสภาพแวดล้อม Python 2.7 ของฉันใน macOS ปรากฎว่าเส้นทาง conda นั้นแย่:

สภาพแวดล้อมฐาน (3.7):

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 สภาพแวดล้อม (ไม่มีเส้นทาง!):

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

การแก้ไข:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem

1

ข้อผิดพลาด SSL: CERTIFICATE_VERIFY_FAILED อาจเกิดขึ้นได้เนื่องจากใบรับรองระดับกลางขาดหายไปในca-certificatesแพ็คเกจบน Linux ตัวอย่างเช่นในกรณีของฉันใบรับรองระดับกลาง " DigiCert SHA2 Secure Server CA " หายไปในca-certificatesแพ็คเกจแม้ว่าเบราว์เซอร์ Firefox จะรวมอยู่ด้วย คุณสามารถค้นหาว่าใบรับรองใดหายไปโดยการเรียกใช้wgetคำสั่งโดยตรงบน URL ที่ทำให้เกิดข้อผิดพลาดนี้ จากนั้นคุณสามารถค้นหาลิงก์ที่เกี่ยวข้องไปยังไฟล์ CRT สำหรับใบรับรองนี้จากเว็บไซต์ทางการ (เช่นhttps://www.digicert.com/digicert-root-certificates.htmในกรณีของฉัน) ของ Certificate Authority ตอนนี้เพื่อรวมใบรับรองที่ขาดหายไปในกรณีของคุณคุณสามารถเรียกใช้คำสั่งด้านล่างโดยใช้ลิงค์ดาวน์โหลดไฟล์ CRT ของคุณแทน:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

หลังจากนี้คุณอาจทดสอบอีกครั้งด้วย wgetสำหรับ URL ของคุณรวมถึงโดยใช้urllibแพ็คเกจหลาม สำหรับรายละเอียดเพิ่มเติมโปรดดูที่: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242


0

หากคุณใช้ vCenter 6 คุณควรเพิ่มผู้มีสิทธิ์ออกใบรับรอง vmware ของ vCenter ของคุณลงในรายการ CA ที่เชื่อถือได้ของระบบปฏิบัติการของคุณ ในการดาวน์โหลดใบรับรองของคุณให้ทำดังต่อไปนี้

  1. เปิดเว็บเบราว์เซอร์ของคุณ
  2. นำทางไปยัง https: //
  3. ที่มุมล่างขวาให้คลิกลิงก์ดาวน์โหลด Trusted Root CA

บน Fedora

  1. เปิดเครื่องรูดและเปลี่ยนนามสกุลจาก. 0 เป็น .cer
  2. คัดลอกไปยัง / etc / pki / ca-trust / source / anchors /
  3. รันคำสั่ง update-ca-trust

ลิงค์:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856

เขากล่าวว่าเขาใช้ OS X ไม่ใช่ vCenter 6
jww

0

ขั้นตอนการติดตั้งสำหรับ nltk (ฉันติดตั้ง python3 (3.6.2) แล้วใน MAC OS X

sudo easy_install pip

ใช้ตัวเลือกละเว้นการติดตั้งเพื่อละเว้นการถอนการติดตั้งหกรุ่นก่อนหน้านี้มันมีข้อผิดพลาดขณะถอนการติดตั้งและไม่ส่งต่อภาพยนตร์

sudo pip3 install -U nltk --ignore-installed six

ตรวจสอบการติดตั้ง pip และ python ใช้เวอร์ชั่น '3'

which python python2 python3
which pip pip2 pip3

ตรวจสอบว่ามีการติดตั้ง NLTK

python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']

ติดตั้งใบรับรอง SSL ก่อนที่จะติดตั้งหนังสือตัวอย่างมิฉะนั้นเราจะออกใบรับรองข้อผิดพลาดขณะติดตั้งตัวอย่าง

/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book

การติดตั้งนั้นเสร็จสมบูรณ์ของ nltk และ nltk_ata สำหรับตัวอย่างหนังสือ


0

การติดตั้งPyOpenSSLโดยใช้pipงานได้สำหรับฉัน (โดยไม่ต้องแปลงเป็น PEM):

pip install PyOpenSSL

0

ฉันพบปัญหานี้แล้วโดยปิด Fiddler (พร็อกซีการดีบัก HTTP) ตรวจสอบว่าคุณเปิดใช้งานพรอกซีแล้วและลองอีกครั้ง


0

ใน python 2.7 การเพิ่มรายละเอียด CA หลักที่เชื่อถือได้ที่ส่วนท้ายของไฟล์ C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem ช่วย

หลังจากนั้นฉันก็ทำการรัน (โดยใช้สิทธิ์ของผู้ดูแลระบบ) การติดตั้ง pip --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName

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