Saya mendapatkan kesalahan berikut:
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)>
Ini adalah kode yang menyebabkan kesalahan ini:
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 yang saya gunakan mengharuskan saya menggunakan HTTPS. Bagaimana saya bisa melewati verifikasi?
python
python-2.7
ssl
ssl-certificate
urllib
pengguna3724476
sumber
sumber
Jawaban:
Jika Anda hanya ingin memotong verifikasi, Anda dapat membuat konteks SSLC baru . Secara default, konteks yang baru dibuat menggunakan CERT_NONE .
Hati-hati dengan ini sebagaimana dinyatakan dalam bagian 17.3.7.2.1
Tetapi jika Anda hanya ingin itu berfungsi sekarang karena alasan lain Anda dapat melakukan hal berikut, Anda harus melakukannya
import ssl
juga:Ini seharusnya bisa menyelesaikan masalah Anda tetapi Anda tidak benar-benar menyelesaikan masalah apa pun, tetapi Anda tidak akan melihatnya
[SSL: CERTIFICATE_VERIFY_FAILED]
karena Anda sekarang tidak memverifikasi sertifikat!Untuk menambahkan hal di atas, jika Anda ingin tahu lebih banyak tentang mengapa Anda melihat masalah ini, Anda ingin melihat PEP 476 .
Ada pilihan keluar yang disarankan yang tidak berbeda dengan saran saya di atas:
Ia juga memiliki opsi yang sangat tidak disarankan melalui monkeypatching yang tidak sering Anda lihat dengan python:
Yang mengesampingkan fungsi default untuk pembuatan konteks dengan fungsi untuk membuat konteks yang tidak diverifikasi.
Harap dicatat dengan ini seperti yang dinyatakan dalam PEP:
Jika Anda ingin membaca makalah tentang mengapa tidak memvalidasi sertifikat buruk dalam perangkat lunak, Anda dapat menemukannya di sini !
sumber
setup.py upload
bagaimana cara memperbaikinya?certifi
dan memperbarui openssl pada kotak.context
adalah apa yang saya butuhkanIni bukan solusi untuk masalah spesifik Anda, tetapi saya menaruhnya di sini karena utas ini adalah hasil Google teratas untuk "SSL: CERTIFICATE_VERIFY_FAILED", dan ini membawa saya pada pengejaran angsa liar.
Jika Anda telah menginstal Python 3.6 pada OSX dan mendapatkan kesalahan "SSL: CERTIFICATE_VERIFY_FAILED" ketika mencoba terhubung ke situs https: //, itu mungkin karena Python 3.6 pada OSX tidak memiliki sertifikat sama sekali, dan tidak dapat memvalidasi SSL apa pun koneksi. Ini adalah perubahan untuk 3.6 pada OSX, dan memerlukan langkah pasca pemasangan, yang menginstal
certifi
paket sertifikat. Ini didokumentasikan dalam ReadMe, yang harus Anda temukan di/Applications/Python\ 3.6/ReadMe.rtf
ReadMe akan membuat Anda menjalankan skrip pasca pemasangan ini, yang hanya menginstal
certifi
:/Applications/Python\ 3.6/Install\ Certificates.command
Catatan rilis memiliki beberapa info lebih lanjut: https://www.python.org/downloads/release/python-360/
sumber
/Applications/Python\ 3.7/Install\ Certificates.command
menjalankan ini langsung diterminal
! Terima kasih @CraigGlennie & @muyong, saya menghargai tempatout-of-the-box-thinking
ini!Untuk memperluas jawaban Craig Glennie:
dalam Python 3.6.1 di MacOs Sierra
Memasuki ini di terminal bash memecahkan masalah:
sumber
sudo /Applications/Python\ 3.6/Install\ Certificates.command
jika izin ditolak.Pada Windows, Python tidak melihat sertifikat sistem, ia menggunakan yang terletak di
?\lib\site-packages\certifi\cacert.pem
.Solusi untuk masalah Anda:
cacert.pem
lokasi Anda :from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
cacert.pem
file dan rekatkan sertifikat validasi domain Anda di akhir file.sumber
lib\site-packages\certifi\cacert.pem
tidak ada di Python 2.7.10. Dan pertanyaannya adalah tentangurllib2
tidakrequests
/usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem
. Terima kasih!Solusi saya untuk Mac OS X:
1) Tingkatkan ke Python 3.6.5 menggunakan aplikasi asli Pemasang Python yang diunduh dari situs web resmi bahasa Python https://www.python.org/downloads/
Saya menemukan bahwa penginstal ini berupaya memperbarui tautan dan symlink untuk Python baru jauh lebih baik daripada homebrew.
2) Instal sertifikat baru menggunakan "./Install Certificates.command" yang ada di direktori Python 3.6 yang disegarkan
sumber
Anda dapat mencoba menambahkan ini ke variabel lingkungan Anda:
Perhatikan bahwa ini akan menonaktifkan semua verifikasi HTTP sehingga sedikit pendekatan godam, namun jika verifikasi tidak diperlukan, itu mungkin solusi yang efektif.
sumber
Saya mengalami masalah yang sama, meskipun saya menggunakan
urllib.request.urlopen
di Python 3.4, 3.5, dan 3.6 . (Ini adalah bagian dari Python 3 yang setara denganurllib2
, per catatan di kepalaurllib2
halaman dokumentasi Python 2. )Solusi saya adalah
pip install certifi
menginstalcertifi
, yang memiliki:Kemudian, dalam kode saya di mana saya sebelumnya baru saja:
Saya merevisinya menjadi:
Jika saya membaca
urllib2.urlopen
dokumentasi dengan benar, ia juga memilikicafile
argumen. Begitu,urllib2.urlopen([...], certifi.where())
mungkin bekerja untuk Python 2.7 juga.UPDATE (2020/01/01): Pada Python 3.6, yang
cafile
argumen untukurlopen
telah usang , dengancontext
argumen seharusnya ditentukan sebagai gantinya. Saya menemukan yang berikut ini berfungsi dengan baik pada 3,5 hingga 3,8:sumber
load_verify_locations
bermutasiSSLContext
instance dan kembaliNone
. Anda harus menggunakannyacontext=ssl.create_default_context(cafile=certifi.where())
sebagai gantinya. Lihatssl
dokumen untuk info lebih lanjut.ssl
fungsi yang salah . Lihat edit; baik?Diambil dari sini https://gist.github.com/michaelrice/a6794a017e349fc65d01
sumber
Seperti yang saya tulis dalam komentar, masalah ini mungkin terkait dengan jawaban SO ini .
Singkatnya: ada beberapa cara untuk memverifikasi sertifikat. Verifikasi yang digunakan oleh OpenSSL tidak kompatibel dengan sertifikat root tepercaya yang Anda miliki di sistem Anda. OpenSSL digunakan oleh Python.
Anda bisa mencoba untuk mendapatkan sertifikat yang hilang untuk Verisign Kelas 3 Otoritas Sertifikasi Publik Publik dan kemudian menggunakan
cafile
opsi sesuai dengan dokumentasi Python :sumber
Saya memiliki masalah serupa di salah satu mesin Linux saya. Membuat sertifikat baru dan mengekspor variabel lingkungan yang menunjuk ke direktori sertifikat memperbaikinya untuk saya:
sumber
Saya perlu menambahkan jawaban lain karena seperti Craig Glennie, saya melakukan pengejaran angsa liar karena banyak posting yang merujuk pada masalah ini di seluruh Web.
Saya menggunakan MacPorts, dan apa yang awalnya saya pikir adalah masalah Python sebenarnya adalah masalah MacPorts: ia tidak menginstal sertifikat root dengan pemasangan openssl. Solusinya adalah
port install curl-ca-bundle
, seperti yang disebutkan dalam posting blog ini .sumber
Saya menemukan ini di sini
Saya menemukan solusi ini, masukkan kode ini di awal file sumber Anda:
Kode ini membuat verifikasi dibatalkan sehingga sertifikasi ssl tidak diverifikasi.
sumber
Untuk Python 3.4+ pada Centos 6/7 , Fedora , cukup instal CA tepercaya dengan cara ini:
/etc/pki/ca-trust/source/anchors/
update-ca-trust force-enable
update-ca-trust extract
sumber
Solusi untuk Anaconda
Setup saya adalah Anaconda Python 3.7 pada MacOS dengan proxy. Jalannya berbeda.
yang pada sistem saya diproduksi
Setelah Anda tahu di mana sertifikat pergi, maka Anda menggabungkan sertifikat yang digunakan oleh proxy ke akhir file itu.
Saya sudah menyiapkan konda untuk bekerja dengan proxy saya, dengan menjalankan:
Jika Anda tidak ingat di mana sertifikat Anda, Anda dapat menemukannya di
~/.condarc
:Sekarang gabungkan file tersebut sampai akhir
/miniconda3/ssl/cert.pem
dan permintaan akan berfungsi, dan khususnyasklearn.datasets
alat yang serupa harus berfungsi.Peringatan lebih lanjut
Solusi lain tidak berfungsi karena pengaturan Anaconda sedikit berbeda:
Jalan
Applications/Python\ 3.X
itu tidak ada.Jalur yang disediakan oleh perintah di bawah ini adalah jalur SALAH
sumber
Saya menggantungkan kepalaku setengah malu, karena saya memiliki masalah yang sama, kecuali bahwa dalam kasus saya, URL yang saya pukul valid, sertifikat itu valid. Apa yang tidak valid adalah koneksi saya ke web. Saya telah gagal menambahkan detail proxy ke browser (yaitu dalam hal ini). Ini menghentikan proses verifikasi agar tidak terjadi dengan benar.
Menambahkan rincian proxy dan python saya sangat senang.
sumber
Python 2.7.12 (default, 29 Jul 2016, 15:26:22) memperbaiki masalah yang disebutkan. Informasi ini dapat membantu orang lain.
sumber
certifi
, yang tampaknya merupakan gesekan dari sertifikat yang dipegang olehrequests
, memperbaiki masalah saya di Python 3.4 hingga 3.6 .Saya terkejut semua instruksi ini tidak menyelesaikan masalah saya. Meskipun demikian, diagnostiknya benar (BTW, saya menggunakan Mac dan Python3.6.1). Jadi, untuk meringkas bagian yang benar:
Bagi saya, skrip tidak berfungsi, dan semua instalasi yang bersertifikat dan openssl gagal untuk memperbaiki juga. Mungkin karena saya memiliki beberapa instalasi python 2 dan 3, serta banyak virtualenv. Pada akhirnya, saya harus memperbaikinya dengan tangan.
Jika itu masih gagal Anda. Kemudian instal ulang OpenSSL juga.
sumber
Seperti Anda, saya menggunakan python 2.7 di iMac lama saya (OS X 10.6.8), saya juga menemui masalah, menggunakan urllib2.urlopen:
Program saya berjalan dengan baik tanpa masalah sertifikat SSL dan tiba-tiba (setelah program dowloading), mereka gagal dengan kesalahan SSL ini.
Masalahnya adalah versi python yang digunakan:
Tidak ada masalah dengan https://www.python.org/downloads dan python-2.7.9-macosx10.6.pkg
masalah dengan satu instaled oleh alat Homebrew : "brew install python", versi terletak di / usr / local / bin.
Sebuah bab, berjudul
Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
, in/Applications/Python 2.7/ReadMe.rtf
menjelaskan masalah dengan banyak detail.Jadi, periksa, unduh, dan masukkan PATH Anda versi python yang tepat.
sumber
Python 2.7 di Amazon EC2 dengan centOS 7
Saya harus mengatur variabel env
SSL_CERT_DIR
untuk menunjuk ke sayaca-bundle
yang terletak di/etc/ssl/certs/ca-bundle.crt
sumber
SSL_CERT_DIR
ke/etc/ssl/certs
, dan juga memastikanca-certificates
paket itu diinstal dan terbaru.Sumber: https://access.redhat.com/articles/2039753
sumber
Mencoba
Ini berhasil untuk saya.
sumber
Melihat
/ Aplikasi / Python 3.6 / Instal Certificates.command
Anda juga dapat pergi ke Aplikasi dan mengklik Certificates.command
sumber
Dalam kasus saya, saya mendapatkan kesalahan ini karena
requests
danurllib3
versi tidak kompatibel, memberikan kesalahan berikut selama instalasi:melakukan trik.
sumber
Solusi Anaconda lainnya.Saya mendapatkan CERTIFICATE_VERIFY_FAILED di lingkungan Python 2.7 saya di macOS. Ternyata jalur konda buruk:
lingkungan base (3.7):
2,7 lingkungan (jalur tidak ada!):
Cara mengatasinya:
sumber
Kesalahan SSL: CERTIFICATE_VERIFY_FAILED juga bisa terjadi karena Sertifikat Menengah hilang dalam
ca-certificates
paket di Linux. Misalnya, dalam kasus saya, sertifikat perantara " DigiCert SHA2 Secure Server CA " tidak ada dalamca-certificates
paket meskipun peramban Firefox menyertakannya. Anda dapat mengetahui sertifikat mana yang hilang dengan langsung menjalankanwget
perintah pada URL yang menyebabkan kesalahan ini. Kemudian Anda dapat mencari tautan yang sesuai dengan file CRT untuk sertifikat ini dari situs web resmi (mis. Https://www.digicert.com/digicert-root-certificates.htm dalam kasus saya) dari Otoritas Sertifikat. Sekarang, untuk memasukkan sertifikat yang hilang dalam kasus Anda, Anda dapat menjalankan perintah di bawah ini menggunakan tautan unduh file CRT Anda sebagai gantinya:Setelah ini, Anda dapat menguji lagi dengan
wget
untuk URL Anda serta dengan menggunakanurllib
paket python . Untuk detail lebih lanjut, lihat: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242sumber
Jika Anda menggunakan vCenter 6, Anda harus menambahkan sertifikat otoritas vmware vCenter ke daftar CA tepercaya OS Anda. Untuk mengunduh sertifikat Anda, lakukan hal berikut
Di Fedora
Tautan:
sumber
menginstal langkah-langkah untuk nltk (saya punya python3 (3.6.2) sudah diinstal di MAC OS X
gunakan opsi abaikan yang diinstal untuk mengabaikan mencopot pemasangan enam versi sebelumnya, jika tidak, ia memberikan kesalahan saat mencopot pemasangan dan tidak meneruskan film
Periksa instalasi pip dan python, gunakan versi '3'
Periksa apakah NLTK diinstal
Instal sertifikat SSL sebelum menginstal buku contoh, jika tidak kami akan memberikan sertifikat kesalahan saat menginstal contoh
Itu berhasil menyelesaikan instalasi nltk dan nltk_ata untuk contoh buku
sumber
Menginstal
PyOpenSSL
menggunakanpip
berfungsi untuk saya (tanpa mengkonversi ke PEM):sumber
Saya memiliki masalah ini diselesaikan dengan menutup Fiddler (proxy debugging HTTP) memeriksa apakah Anda memiliki proxy yang diaktifkan dan coba lagi.
sumber
Dalam python 2.7 menambahkan rincian CA akar Tepercaya di akhir dalam file C: \ Python27 \ lib \ situs-paket \ certifi \ cacert.pem membantu
setelah itu saya menjalankan (menggunakan hak admin) menginstal pip --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName
sumber