Saya punya sedikit aplikasi yang saya tulis dengan Python dan dulu berfungsi ... sampai kemarin, ketika tiba-tiba mulai memberi saya kesalahan dalam koneksi HTTPS. Saya tidak ingat apakah ada pembaruan, tetapi kedua Python 2.7.3rc2 dan Python 3.2 gagal sama.
Saya mencari di Google dan menemukan bahwa ini terjadi ketika orang-orang di belakang proxy, tetapi saya tidak (dan tidak ada yang berubah di jaringan saya sejak terakhir kali bekerja). Komputer syster saya yang menjalankan windows dan Python 2.7.2 tidak memiliki masalah (di jaringan yang sama).
>>> url = 'https://www.mediafire.com/api/user/get_session_token.php'
>>> response = urllib2.urlopen(url).read()
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:504: EOF occurred in violation of protocol>
Apa yang salah? Bantuan apa pun dihargai.
PS: Versi python yang lebih lama juga tidak bekerja, tidak di sistem saya dan tidak di sesi langsung dari USB, tetapi DO bekerja di sesi langsung Ubuntu 11.10.
Jawaban:
Ini tampaknya terkait dengan penambahan dukungan TLS 1.1 dan 1.2 ke versi OpenSSL yang ditemukan di 12.04. Kegagalan koneksi dapat direproduksi dengan alat baris perintah OpenSSL:
Sambungan berhasil jika saya memaksa koneksi untuk menggunakan TLS 1.0 dengan
-tls1
argumen baris perintah.Saya sarankan Anda mengajukan laporan bug tentang masalah ini di sini:
https://bugs.launchpad.net/ubuntu/+filebug
sumber
Untuk pemula python seperti saya, berikut adalah cara untuk mengganti httplib cara termudah. Di bagian atas skrip python Anda, sertakan baris ini:
Mulai sekarang, Anda dapat menggunakan urllib atau apa pun yang Anda gunakan seperti biasanya.
Catatan: Ini untuk python 2.7. Untuk solusi python 3.x, Anda perlu mengganti kelas HTTPSConnection yang ditemukan di http.client. Saya meninggalkan itu sebagai latihan untuk pembaca. :-)
sumber
httplib
. Orang-orang dapat menggunakan soket SSL lain. Orang bisa menambalssl
bukan sebagai jawaban saya di bawah ini.BadStatusLine: ''
Anda dapat menghindari memodifikasi file httplib.py dengan memodifikasi objek HTTPSConnection Anda:
Metode permintaan membuat soket baru hanya jika connection.sock tidak didefinisikan. Membuat sendiri menambahkan parameter ssl_version akan membuat metode permintaan menggunakannya. Kemudian semuanya berjalan seperti biasa.
Saya mengalami masalah yang sama dan ini bekerja untuk saya.
Salam
sumber
Masalahnya adalah
ssl
, tidak ada hubungannya dengan HTTP, jadi mengapa menambalhttplib
jika Anda bisa menambalssl
. Kode berikut harus memperbaiki semua soket SSL termasuk, tetapi tidak terbatas pada HTTPS, untuk Python 2.6+ (bawaanssl
, tidak mencoba denganpyopenssl
).sumber
EDIT httplib.py (/usr/lib/pythonX.X/httplib.py di Linux)
CARI deklarasi kelas koneksi HTTPS
Di dalam kode CHANGE baris baris
UNTUK
Maka permintaan HTTPS httplib harus bekerja
sumber
Masalah ini kemungkinan karena SSLv2 dinonaktifkan di server web, tetapi Python 2.x mencoba untuk membuat koneksi dengan PROTOCOL_SSLv23 secara default.
Inilah tautan ke jawaban saya untuk masalah serupa di Stack Overflow - /programming//a/24166498/41957
Pembaruan: ini secara fungsional sama dengan jawaban @ temoto di atas.
sumber
Perbaikan sederhana yang berhasil bagi saya adalah mengganti protokol default SSL:
sumber