Saya sedang mengerjakan skrip sederhana yang melibatkan CAS, pemeriksaan keamanan jspring, pengalihan, dll. Saya ingin menggunakan permintaan python Kenneth Reitz karena ini adalah pekerjaan yang hebat! Namun, CAS mengharuskan untuk divalidasi melalui SSL jadi saya harus melewati langkah itu terlebih dahulu. Saya tidak tahu apa yang diinginkan permintaan Python? Di mana seharusnya sertifikat SSL ini berada?
Traceback (most recent call last):
File "./test.py", line 24, in <module>
response = requests.get(url1, headers=headers)
File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request
File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
python
ssl
python-requests
urllib3
TedBurrows
sumber
sumber
Jawaban:
Masalah yang Anda alami disebabkan oleh sertifikat SSL yang tidak dipercaya.
Seperti @dirk yang disebutkan dalam komentar sebelumnya, perbaikan tercepat adalah pengaturan
verify=False
:Harap dicatat bahwa ini akan menyebabkan sertifikat tidak diverifikasi. Ini akan memaparkan aplikasi Anda pada risiko keamanan, seperti serangan man-in-the-middle.
Tentu saja, terapkan penilaian. Seperti disebutkan dalam komentar, ini mungkin dapat diterima untuk aplikasi / skrip cepat / sekali pakai, tetapi sebenarnya tidak boleh pergi ke perangkat lunak produksi .
Jika hanya melewatkan pemeriksaan sertifikat tidak dapat diterima dalam konteks khusus Anda, pertimbangkan opsi berikut, opsi terbaik Anda adalah mengatur
verify
parameter ke string yang merupakan jalur.pem
file sertifikat (yang harus Anda peroleh dengan semacam pengamanan cara).Jadi, pada versi 2.0,
verify
parameter menerima nilai berikut, dengan semantik masing-masing:True
: menyebabkan sertifikat divalidasi terhadap otoritas sertifikat tepercaya perpustakaan itu sendiri (Catatan: Anda dapat melihat Permintaan Sertifikat Akar mana yang digunakan melalui perpustakaan Certifi, basis data kepercayaan RC yang diekstraksi dari Permohonan: Certifi - Database Kepercayaan untuk Manusia ).False
: melewati validasi sertifikat sepenuhnya .Sumber: Permintaan - Verifikasi Sertifikat SSL
Lihat juga
cert
parameter pada tautan yang sama.sumber
verify=False
menonaktifkan pemeriksaan sertifikat SSL host.Dari dokumentasi permintaan pada verifikasi SSL :
Jika Anda tidak ingin memverifikasi sertifikat SSL Anda, buat
verify=False
sumber
Nama file CA untuk digunakan Anda dapat melewati
verify
:Jika Anda menggunakan
verify=True
makarequests
gunakan CA sendiri yang mungkin tidak memiliki CA yang menandatangani sertifikat server Anda.sumber
requests
dapat dikemas untuk distribusi Anda. Jalankanpython -mrequests.certs
untuk mencari tahu ke mana itu menunjuk.cacert.pem
dari curl. Ini berisi banyak sertifikat yang dicabut. Lihat Certifi (yang Dimintacacert.pem
adalah sertifikat CA diekstraksi dari Mozilla (oleh cURL) - itu hanya sebuah contoh (jika daftar CA digunakan oleh web populer -browser tidak dapat digunakan sebagai contoh maka saya tidak tahu apa yang bisa menjadi) - titik jawaban bahwa Anda dapat melewati file CA Anda sendiri jika daftar default gagal.$ pip install -U requests[security]
Ketika pertanyaan ini dibuka (2012-05) versi Permintaan adalah 0.13.1. Pada versi 2.4.1 (2014-09) ekstra "keamanan" diperkenalkan, menggunakan
certifi
paket jika tersedia.Saat ini (2016-09) versi utamanya adalah 2.11.1, yang berfungsi baik tanpa
verify=False
. Tidak perlu digunakanrequests.get(url, verify=False)
, jika dipasang denganrequests[security]
ekstra.sumber
pip install -U requests[security] --no-cache
dua kali danpip install certifi==2015.04.28
pip install --upgrade pip
sebelum menginstal paket keamanan permintaan untuk menghindari kesalahan lainSaya mengalami masalah yang sama dan sertifikat ssl memverifikasi masalah gagal ketika menggunakan aws boto3, dengan meninjau kode boto3, saya menemukan
REQUESTS_CA_BUNDLE
itu tidak diatur, jadi saya memperbaiki kedua masalah dengan mengaturnya secara manual:Untuk aws-cli, saya kira pengaturan REQUESTS_CA_BUNDLE di
~/.bashrc
akan memperbaiki masalah ini (tidak diuji karena aws-cli saya berfungsi tanpanya).sumber
Jika Anda memiliki perpustakaan yang bergantung pada
requests
dan Anda tidak dapat memodifikasi jalur verifikasi (seperti denganpyvmomi
) maka Anda harus menemukancacert.pem
bundel dengan permintaan dan menambahkan CA Anda di sana. Berikut ini pendekatan umum untuk menemukancacert.pem
lokasi:windows
linux
btw. @ request-devs, mem-bundle cacerts Anda sendiri dengan permintaan benar-benar menjengkelkan ... terutama fakta bahwa Anda tampaknya tidak menggunakan sistem ca store terlebih dahulu dan ini tidak didokumentasikan di mana pun.
memperbarui
dalam situasi, di mana Anda menggunakan perpustakaan dan tidak memiliki kendali atas lokasi bundel, Anda juga bisa secara eksplisit mengatur lokasi bundel menjadi kumpulan bundel host Anda:
sumber
verify
jalur.Saya menghadapi masalah yang sama menggunakan gspread dan perintah ini berfungsi untuk saya:
sumber
Jika Anda ingin menghapus peringatan, gunakan kode di bawah ini.
dan
verify=False
denganrequest.get
ataupost
metodesumber
Saya telah menemukan pendekatan khusus untuk menyelesaikan masalah yang sama. Idenya adalah menunjuk file cacert yang disimpan di sistem dan digunakan oleh aplikasi berbasis ssl lain.
Di Debian (saya tidak yakin apakah sama di distribusi lain) file sertifikat (.pem) disimpan di
/etc/ssl/certs/
Jadi, ini adalah kode yang berfungsi untuk saya:Untuk menebak
pem
file apa yang dipilih, saya telah menelusuri url dan memeriksa Otoritas Sertifikat (CA) mana yang telah menghasilkan sertifikat.EDIT: jika Anda tidak dapat mengedit kode (karena Anda menjalankan aplikasi ketiga), Anda dapat mencoba menambahkan
pem
sertifikat langsung ke/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
(misalnya menyalinnya ke akhir file).sumber
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
dengan symlink ke OS store?Jika Anda tidak peduli tentang sertifikat, gunakan saja
verify=False
.sumber
Setelah berjam-jam melakukan debug, saya hanya bisa membuatnya bekerja menggunakan paket berikut:
menggunakan
OpenSSL 1.0.2g 1 Mar 2016
Tanpa paket-paket ini
verify=False
ini tidak berfungsi.Saya harap ini membantu seseorang.
sumber
Saya mengalami masalah yang sama. Ternyata saya belum menginstal sertifikat perantara di server saya (cukup tambahkan ke bagian bawah sertifikat Anda seperti yang terlihat di bawah).
https://www.digicert.com/ssl-support/pem-ssl-creation.htm
Pastikan Anda telah menginstal paket ca-sertifikat:
Memperbarui waktu juga dapat menyelesaikan ini:
Jika Anda menggunakan sertifikat yang ditandatangani sendiri, Anda mungkin harus menambahkannya ke sistem Anda secara manual.
sumber
Jika panggilan permintaan terkubur di suatu tempat jauh di dalam kode dan Anda tidak ingin menginstal sertifikat server, maka, hanya untuk keperluan debug saja , dimungkinkan untuk melakukan monkeypatch permintaan:
Jangan pernah gunakan dalam produksi!
sumber
Terlambat ke pesta, kurasa tapi aku ingin menempelkan perbaikan untuk sesama pengembara seperti diriku! Jadi, berikut ini berhasil bagi saya di Python 3.7.x
Ketikkan yang berikut di terminal Anda
Coba jalankan kembali skrip / permintaan Anda dan lihat apakah itu berfungsi (saya yakin itu belum diperbaiki!). Jika tidak berhasil maka coba jalankan perintah berikut di terminal secara langsung
sumber
Saya berjuang masalah ini selama JAM.
Saya mencoba memperbarui permintaan. Kemudian saya memperbarui sertifikat. Saya menunjuk memverifikasi ke certifi.where () (Kode melakukan ini secara default lagian). Tidak ada yang berhasil.
Akhirnya saya memperbarui versi python saya ke python 2.7.11. Saya menggunakan Python 2.7.5 yang memiliki beberapa ketidakcocokan dengan cara sertifikat diverifikasi. Setelah saya memperbarui Python (dan beberapa dependensi lainnya) mulai bekerja.
sumber
Ini mirip dengan jawaban @ rafael-almeida, tapi saya ingin menunjukkan bahwa pada permintaan 2.11+, tidak ada 3 nilai yang
verify
dapat diambil, sebenarnya ada 4:True
: memvalidasi terhadap CA tepercaya permintaan internal.False
: melewati validasi sertifikat sepenuhnya . (Tidak direkomendasikan)Sisa jawaban saya adalah tentang # 4, cara menggunakan direktori yang berisi sertifikat untuk memvalidasi:
Dapatkan sertifikat publik yang diperlukan dan letakkan di direktori.
Sebenarnya, Anda mungkin "harus" menggunakan metode out-of-band untuk memperoleh sertifikat, tetapi Anda juga bisa mengunduhnya menggunakan browser apa pun.
Jika server menggunakan rantai sertifikat, pastikan untuk mendapatkan setiap sertifikat tunggal dalam rantai tersebut.
Menurut dokumentasi permintaan, direktori yang berisi sertifikat harus terlebih dahulu diproses dengan utilitas "rehash" (
openssl rehash
).(Ini membutuhkan openssl 1.1.1+, dan tidak semua implementasi Windows openssl mendukung pengulangan. Jika
openssl rehash
tidak berhasil, Anda dapat mencoba menjalankan skrip pengulangan ruby di https://github.com/ruby/openssl/blob/master /sample/c_rehash.rb , meskipun saya belum mencoba ini.)Saya mengalami beberapa masalah dengan mendapatkan permintaan untuk mengenali sertifikat saya, tetapi setelah saya menggunakan
openssl x509 -outform PEM
perintah untuk mengubah sertifikat ke Base64.pem
format , semuanya bekerja dengan sempurna.Anda juga bisa hanya mengulangi dengan malas:
sumber
Saat ini ada masalah dalam modul permintaan yang menyebabkan kesalahan ini, hadir dalam v2.6.2 hingga v2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573
Solusi untuk masalah ini adalah menambahkan baris berikut:
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'
sumber
Seperti disebutkan oleh @Rafael Almeida, masalah yang Anda alami disebabkan oleh sertifikat SSL yang tidak dipercaya. Dalam kasus saya, sertifikat SSL tidak dipercaya oleh server saya. Untuk menyiasatinya tanpa mengurangi keamanan, saya mengunduh sertifikat , dan memasangnya di server (hanya dengan mengklik dua kali pada file .crt lalu Instal Sertifikat ...).
sumber
Tidak mungkin menambahkan opsi jika permintaan dipanggil dari paket lain. Dalam hal itu menambahkan sertifikat ke bundel cacert adalah jalan yang lurus, misalnya saya harus menambahkan "StartCom Class 1 Server Intermediate Primer CA", yang saya unduh sertifikat root ke StartComClass1.pem. mengingat virtualenv saya bernama caldav, saya menambahkan sertifikat dengan:
salah satu dari mereka mungkin cukup, saya tidak memeriksa
sumber
Saya mengalami masalah validasi sertifikasi yang sama atau sama. Saya membaca bahwa versi OpenSSL kurang dari 1.0.2, yang bergantung pada permintaan terkadang mengalami kesulitan untuk memvalidasi sertifikat yang kuat (lihat di sini ). CentOS 7 tampaknya menggunakan 1.0.1e yang tampaknya memiliki masalah.
Saya tidak yakin bagaimana mengatasi masalah ini pada CentOS, jadi saya memutuskan untuk mengizinkan sertifikat CA 1024bit yang lebih lemah.
sumber
Saya harus memutakhirkan dari Python 3.4.0 ke 3.4.6
sumber
Dalam kasus saya alasannya cukup sepele.
Saya telah mengetahui bahwa verifikasi SSL telah berfungsi hingga beberapa hari sebelumnya, dan ternyata bekerja pada mesin yang berbeda.
Langkah saya berikutnya adalah membandingkan konten dan ukuran sertifikat antara mesin tempat verifikasi berfungsi, dan yang tidak berfungsi.
Ini dengan cepat membuat saya menentukan bahwa Sertifikat pada mesin yang 'salah' itu tidak bagus, dan begitu saya menggantinya dengan sertifikat 'baik', semuanya baik-baik saja.
sumber