Kesalahan urllib dan "SSL: CERTIFICATE_VERIFY_FAILED"

279

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?

pengguna3724476
sumber
2
Tidak ada yang salah dengan URL dan dapat berhasil diverifikasi dengan sertifikat tepercaya bersama. Jadi sebaiknya Anda tidak mencoba mem-bypass validasi sertifikat, tetapi untuk memperbaikinya. Versi python yang Anda gunakan?
Steffen Ullrich
Ini mungkin terkait dengan stackoverflow.com/a/27826829/3081018 . Server menggunakan jenis rantai sertifikat yang sama dengan beberapa jalur kepercayaan. Lihat di sana kafe mana yang mungkin perlu Anda gunakan untuk verifikasi.
Steffen Ullrich
7
Kesalahan ini juga terjadi pada Python 3.5 setelah memutakhirkan ke yosemite
pyCthon
2
Ini menjelaskan situasinya. access.redhat.com/articles/2039753
Charlie Burns
4
"Bagaimana saya bisa melewati verifikasi?" adalah pertanyaan yang salah. Anda mungkin harus bertanya bagaimana memvalidasi sertifikat yang disediakan oleh domain.
jww

Jawaban:

297

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

Saat memanggil konstruktor SSLContext secara langsung, CERT_NONE adalah default. Karena itu tidak mengotentikasi rekan lain, itu bisa tidak aman, terutama dalam mode klien di mana sebagian besar waktu Anda ingin memastikan keaslian server yang Anda ajak bicara. Karena itu, ketika dalam mode klien, sangat disarankan untuk menggunakan CERT_REQUIRED.

Tetapi jika Anda hanya ingin itu berfungsi sekarang karena alasan lain Anda dapat melakukan hal berikut, Anda harus melakukannya import ssljuga:

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)

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 .

PEP ini mengusulkan untuk mengaktifkan verifikasi tanda tangan sertifikat X509, serta verifikasi nama host untuk klien HTTP Python secara default, dapat memilih untuk tidak ikut serta berdasarkan panggilan per panggilan. Perubahan ini akan diterapkan ke Python 2.7, Python 3.4, dan Python 3.5.

Ada pilihan keluar yang disarankan yang tidak berbeda dengan saran saya di atas:

import ssl

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

Ia juga memiliki opsi yang sangat tidak disarankan melalui monkeypatching yang tidak sering Anda lihat dengan python:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

Yang mengesampingkan fungsi default untuk pembuatan konteks dengan fungsi untuk membuat konteks yang tidak diverifikasi.

Harap dicatat dengan ini seperti yang dinyatakan dalam PEP:

Panduan ini ditujukan terutama untuk administrator sistem yang ingin mengadopsi versi Python yang lebih baru yang mengimplementasikan PEP ini di lingkungan lama yang belum mendukung verifikasi sertifikat pada koneksi HTTPS. Sebagai contoh, seorang administrator dapat memilih keluar dengan menambahkan monkeypatch di atas untuk sitecustomize.py di Lingkungan Operasi Standar untuk Python. Aplikasi dan perpustakaan TIDAK HARUS membuat proses perubahan ini luas (kecuali mungkin sebagai respons terhadap pengaturan konfigurasi yang dikendalikan administrator sistem).

Jika Anda ingin membaca makalah tentang mengapa tidak memvalidasi sertifikat buruk dalam perangkat lunak, Anda dapat menemukannya di sini !

Noelkd
sumber
1
Jadi, jika kesalahan ini membuat saya tidak menggunakan setup.py uploadbagaimana cara memperbaikinya?
pyCthon
5
ssl._create_default_https_context = ssl._create_unverified_context ini berfungsi untuk saya seperti yang disebutkan oleh Noelkd menjelang akhir. Karena situs kami adalah situs intranet untuk printer HP ... murni digunakan untuk mengikis ... kami tidak memiliki masalah dengan penggunaan metode ini.
ihightower
Metode pertama Anda adalah yang paling tidak diinginkan - validasi bypass. Mengapa yang benar-benar memvalidasi sertifikat tidak terdaftar pertama kali?
jww
1
ini juga dapat terjadi jika Anda memiliki versi openSSL yang lebih lama. Jadi bagi saya apa yang berhasil adalah memperbarui ke versi terbaru certifi dan memperbarui openssl pada kotak.
myusuf3
1
context adalah apa yang saya butuhkan
prayagupd
382

Ini 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 certifipaket 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/

Craig Glennie
sumber
105
Jalankan langsung / Applications / Python \ 3.6 / Install \ Certificates.command menyelesaikan masalah saya di OSX. Terima kasih.
muyong
2
Saya menggunakan OS X El Capitan 10.11.6, Python 3.6.0 dan solusi ini bekerja dengan sempurna.
y2knoproblem
2
Saya menggunakan macOS Sierra 10.12.5, Python 3.6.1 dan solusi ini bekerja dengan sempurna.
James
4
Ini memperbaikinya bagi saya /Applications/Python\ 3.7/Install\ Certificates.command menjalankan ini langsung di terminal! Terima kasih @CraigGlennie & @muyong, saya menghargai tempat out-of-the-box-thinkingini!
JayRizzo
6
Python 3.7 di macOS Mojave: tidak berfungsi di sini. Saya sudah mencopot / menginstal ulang / menjalankan sertifikat instal, reboot, dll. Tidak berfungsi untuk saya
Thomas
71

Untuk memperluas jawaban Craig Glennie:

dalam Python 3.6.1 di MacOs Sierra

Memasuki ini di terminal bash memecahkan masalah:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
jnPy
sumber
3
coba sudo /Applications/Python\ 3.6/Install\ Certificates.commandjika izin ditolak.
KingKongCoder
Ini sebenarnya tidak memperbaiki masalah pada Python 3.6. -1
hyperum
1
Jika menggunakan baris perintah membuat Anda takut (mungkin bukan jika Anda di sini, tapi hei), Anda juga dapat menemukan folder Aplikasi (atau setara pada OS lain) yang dibuat oleh Python pada instalasi, kemudian buka skrip dengan mengklik dua kali. Nama spesifik folder tergantung pada versi Python yang Anda instal.
Erdős-Bacon
Bekerja seperti pesona untuk Python 3.7.3. Terima kasih.
klbytec
Terima kasih. Saya benar-benar mencari 100-an solusi dan Anda berhasil.
nnd
43

Pada Windows, Python tidak melihat sertifikat sistem, ia menggunakan yang terletak di ?\lib\site-packages\certifi\cacert.pem.

Solusi untuk masalah Anda:

  1. unduh sertifikat validasi domain sebagai file * .crt atau * pem
  2. buka file dalam editor dan salin kontennya ke clipboard
  3. temukan cacert.pemlokasi Anda :from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. edit cacert.pemfile dan rekatkan sertifikat validasi domain Anda di akhir file.
  5. Simpan file dan nikmati permintaan!
Bruno Gabuzomeu
sumber
6
lib\site-packages\certifi\cacert.pemtidak ada di Python 2.7.10. Dan pertanyaannya adalah tentang urllib2tidakrequests
Kevin Smyth
2
Solusi terbaik sejauh ini, API twitter menggunakan sertifikat DigiCert yang tidak ada dalam file cacert.pem python saya. Saya menambahkan di sana dan VOILA!
digz6666
2
Bekerja pada Debian. Untuk catatan, path file pada sistem saya adalah: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Terima kasih!
ofavre
Sayangnya permintaan python tidak menggunakan CA trust store sistem operasi. github.com/requests/requests/issues/2966 . Anda harus menetapkan REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 .
jamshid
Bekerja pada Windows 10, Python 3.6, dengan Google dan Twitter API dan modul permintaan secara umum.
brittenb
36

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

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"
Claude COULOMBE
sumber
Bekerja seperti pesona di Mac OS X.
Manu mathew
31

Anda dapat mencoba menambahkan ini ke variabel lingkungan Anda:

PYTHONHTTPSVERIFY=0 

Perhatikan bahwa ini akan menonaktifkan semua verifikasi HTTP sehingga sedikit pendekatan godam, namun jika verifikasi tidak diperlukan, itu mungkin solusi yang efektif.

Chris Halcrow
sumber
17
Saya menduga bahwa menonaktifkan semua verifikasi HTTP untuk semua python agak berlebihan untuk berurusan dengan satu kesalahan dalam verifikasi. Ada banyak kasus di mana seseorang mungkin ingin verifikasi secara default.
trevorKirkby
Bekerja untuk saya di Windows Server 2016 di python 2.7.13. Saya biasanya tidak memiliki python yang diinstal pada server windows tetapi membutuhkannya untuk upgrade vCenter dengan migrasi Nexus 1000v ke VDS, dan ini hanya memperbaiki masalah dengan vCenter cert yang ditandatangani sendiri untuk saat ini (akan menggunakan VMCA dan sertifikat yang valid di lingkungan yang ditingkatkan). Saya tidak beruntung mendapatkan sertifikat yang dapat diterima dengan mengedit cacert.pem dalam paket permintaan python
Christopher Thorjussen
3
Juga, saya mengatur variabel langsung di jendela baris perintah sebelum menjalankan skrip, sehingga tidak akan menonaktifkan semua pemeriksaan seperti @ seseorang atau orang lain yang takut, yang saya juga tidak akan merekomendasikan.
Christopher Thorjussen
Itu sempurna untuk kasus penggunaan saya: pengujian. Saya tidak akan pernah melakukan ini pada produksi, tetapi untuk menjalankan tes yang tidak ada hubungannya dengan SSL, itu pilihan yang bagus.
sorin
Terima kasih, solusi ini berhasil untuk saya: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello
28

Saya mengalami masalah yang sama, meskipun saya menggunakan urllib.request.urlopendi Python 3.4, 3.5, dan 3.6 . (Ini adalah bagian dari Python 3 yang setara dengan urllib2, per catatan di kepala urllib2halaman dokumentasi Python 2. )

Solusi saya adalah pip install certifimenginstal certifi, yang memiliki:

... kumpulan Sertifikat Akar yang dikuratori dengan hati-hati untuk memvalidasi kepercayaan sertifikat SSL sambil memverifikasi identitas host TLS.

Kemudian, dalam kode saya di mana saya sebelumnya baru saja:

import urllib.request as urlrq

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

Saya merevisinya menjadi:

import urllib.request as urlrq
import certifi

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

Jika saya membaca urllib2.urlopendokumentasi dengan benar, ia juga memiliki cafileargumen. Begitu,urllib2.urlopen([...], certifi.where()) mungkin bekerja untuk Python 2.7 juga.


UPDATE (2020/01/01): Pada Python 3.6, yang cafileargumen untuk urlopentelah usang , dengan contextargumen seharusnya ditentukan sebagai gantinya. Saya menemukan yang berikut ini berfungsi dengan baik pada 3,5 hingga 3,8:

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()))
hBy2Py
sumber
1
load_verify_locationsbermutasi SSLContextinstance dan kembali None. Anda harus menggunakannya context=ssl.create_default_context(cafile=certifi.where())sebagai gantinya. Lihat ssldokumen untuk info lebih lanjut.
ostrokach
1
@ostrokach Huh, saya mencoba sesuatu seperti itu, tapi saya pasti menggunakan sslfungsi yang salah . Lihat edit; baik?
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

Diambil dari sini https://gist.github.com/michaelrice/a6794a017e349fc65d01

Prostak
sumber
menguji solusi ini di lingkungan Jenkins, lingkungan pribadi, ini berhasil!
rapport89
2
Ini sangat tidak aman karena melewati SEMUA verifikasi sertifikat, gunakan dengan risiko Anda sendiri dan untuk cinta SIAPA SAJA jangan gunakan ini dalam kode produksi.
dragon788
Terima kasih. Akhirnya berhasil. Tidak perlu bahwa Python 3.6 diinstal di bawah / Aplikasi pada Mac OS. Ini harus menjadi jawaban yang diterima.
Biranchi
Anda seharusnya tidak pernah melakukan monkeypatching seperti itu. Ini sangat berbahaya dan akan memengaruhi semua penggunaan kode di hilir.
Acumenus
10

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 cafileopsi sesuai dengan dokumentasi Python :

urllib2.urlopen(req, cafile="verisign.pem")
Steffen Ullrich
sumber
Bisakah Anda membantu saya menyelesaikan masalah yang relevan ini dengan tautan
Tidak Ada
8

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:

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

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 .

corwin.amber
sumber
5

Saya menemukan ini di sini

Saya menemukan solusi ini, masukkan kode ini di awal file sumber Anda:

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

Kode ini membuat verifikasi dibatalkan sehingga sertifikasi ssl tidak diverifikasi.

Ganesh Chowdhary Sadanala
sumber
lihat video ini membantu saya banyak untuk memahami apa ssl. URL video: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala
4

Untuk Python 3.4+ pada Centos 6/7 , Fedora , cukup instal CA tepercaya dengan cara ini:

  1. Salin CA.crt ke /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract
Cherif KAOUA
sumber
2
Mungkin pertanyaan bodoh, tapi apa itu CA.crt dan di mana saya bisa menemukannya?
Iqbal
4

Solusi untuk Anaconda

Setup saya adalah Anaconda Python 3.7 pada MacOS dengan proxy. Jalannya berbeda.

  • Ini adalah bagaimana Anda mendapatkan jalur sertifikat yang benar :
import ssl
ssl.get_default_verify_paths()

yang pada sistem saya diproduksi

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')

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:

conda config --set ssl_verify <pathToYourFile>.crt

Jika Anda tidak ingat di mana sertifikat Anda, Anda dapat menemukannya di ~/.condarc:

ssl_verify: <pathToYourFile>.crt

Sekarang gabungkan file tersebut sampai akhir /miniconda3/ssl/cert.pem dan permintaan akan berfungsi, dan khususnya sklearn.datasetsalat yang serupa harus berfungsi.

Peringatan lebih lanjut

Solusi lain tidak berfungsi karena pengaturan Anaconda sedikit berbeda:

  • Jalan Applications/Python\ 3.Xitu tidak ada.

  • Jalur yang disediakan oleh perintah di bawah ini adalah jalur SALAH

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Leo
sumber
3

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.

Iklan
sumber
1
Jangan malu-malu karena lupa sesuatu dan kemudian mencari tahu dan berbagi, seseorang mungkin menemukan itu berguna. Menggunakan IE sekalipun ... malu: p
Davos
3

Python 2.7.12 (default, 29 Jul 2016, 15:26:22) memperbaiki masalah yang disebutkan. Informasi ini dapat membantu orang lain.

caot
sumber
3
Saya mengalaminya pada 2.7.12 di mac, menggunakan perpustakaan urllib2, menggunakan perpustakaan requets tampaknya baik-baik saja
marcadian
@marcadian Menginstal dan menggunakan certifi, yang tampaknya merupakan gesekan dari sertifikat yang dipegang oleh requests, memperbaiki masalah saya di Python 3.4 hingga 3.6 .
hBy2Py
3

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:

  • Di Mac, Apple menjatuhkan OpenSSL
  • Python sekarang menggunakan set Sertifikat Root CA sendiri
  • Instalasi Binary Python menyediakan skrip untuk menginstal CA Root sertifikat kebutuhan Python ("/ Applications / Python 3.6 / Install Certificates.command")
  • Baca "/ Aplikasi / Python 3.6 / ReadMe.rtf" untuk detailnya

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.

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

Jika itu masih gagal Anda. Kemudian instal ulang OpenSSL juga.

port install openssl
berniey
sumber
2

Seperti Anda, saya menggunakan python 2.7 di iMac lama saya (OS X 10.6.8), saya juga menemui masalah, menggunakan urllib2.urlopen:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

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:

  1. Tidak ada masalah dengan https://www.python.org/downloads dan python-2.7.9-macosx10.6.pkg

  2. 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.

Thierry Maillard
sumber
2

Python 2.7 di Amazon EC2 dengan centOS 7

Saya harus mengatur variabel env SSL_CERT_DIRuntuk menunjuk ke saya ca-bundleyang terletak di/etc/ssl/certs/ca-bundle.crt

Brian McCall
sumber
Jawaban Anda membawa saya ke jalur yang benar untuk saya. Di ubuntu, saya harus mengatur SSL_CERT_DIRke /etc/ssl/certs, dan juga memastikan ca-certificatespaket itu diinstal dan terbaru.
Norman Breau
1

Mencoba

pip install --trusted-host pypi.python.org nama paket

Ini berhasil untuk saya.

swapnilghorpade
sumber
1

Melihat

/ Aplikasi / Python 3.6 / Instal Certificates.command

Anda juga dapat pergi ke Aplikasi dan mengklik Certificates.command

Danielle Cohen
sumber
1

Dalam kasus saya, saya mendapatkan kesalahan ini karena requestsdan urllib3versi tidak kompatibel, memberikan kesalahan berikut selama instalasi:

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

melakukan trik.

fabio.sang
sumber
1

Solusi Anaconda lainnya.Saya mendapatkan CERTIFICATE_VERIFY_FAILED di lingkungan Python 2.7 saya di macOS. Ternyata jalur konda buruk:

lingkungan base (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 lingkungan (jalur tidak ada!):

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')

Cara mengatasinya:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem
Peter Tseng
sumber
1

Kesalahan SSL: CERTIFICATE_VERIFY_FAILED juga bisa terjadi karena Sertifikat Menengah hilang dalam ca-certificatespaket di Linux. Misalnya, dalam kasus saya, sertifikat perantara " DigiCert SHA2 Secure Server CA " tidak ada dalam ca-certificatespaket meskipun peramban Firefox menyertakannya. Anda dapat mengetahui sertifikat mana yang hilang dengan langsung menjalankan wgetperintah 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:

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

Setelah ini, Anda dapat menguji lagi dengan wgetuntuk URL Anda serta dengan menggunakan urllibpaket python . Untuk detail lebih lanjut, lihat: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

WebDev
sumber
0

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

  1. Buka browser Web Anda.
  2. Arahkan ke https: //
  3. Di sudut kanan bawah, klik tautan Unduh Root Tepercaya CA

Di Fedora

  1. unzip dan ubah ekstensi dari .0 ke .cer
  2. Salin ke / etc / pki / ca-trust / source / anchors /
  3. jalankan perintah pembaruan-ca-trust.

Tautan:

  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
nobler1050
sumber
Dia menyatakan dia menggunakan OS X, bukan vCenter 6.
jww
0

menginstal langkah-langkah untuk nltk (saya punya python3 (3.6.2) sudah diinstal di MAC OS X

sudo easy_install pip

gunakan opsi abaikan yang diinstal untuk mengabaikan mencopot pemasangan enam versi sebelumnya, jika tidak, ia memberikan kesalahan saat mencopot pemasangan dan tidak meneruskan film

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

Periksa instalasi pip dan python, gunakan versi '3'

which python python2 python3
which pip pip2 pip3

Periksa apakah NLTK diinstal

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

Instal sertifikat SSL sebelum menginstal buku contoh, jika tidak kami akan memberikan sertifikat kesalahan saat menginstal contoh

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

Itu berhasil menyelesaikan instalasi nltk dan nltk_ata untuk contoh buku

Narasimha Sai
sumber
0

Menginstal PyOpenSSLmenggunakan pipberfungsi untuk saya (tanpa mengkonversi ke PEM):

pip install PyOpenSSL
averma93
sumber
0

Saya memiliki masalah ini diselesaikan dengan menutup Fiddler (proxy debugging HTTP) memeriksa apakah Anda memiliki proxy yang diaktifkan dan coba lagi.

vperezb
sumber
0

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

MD5
sumber