2013-09-07 16 views
5

Not: Bu kod Ubuntu üzerinde çalışıyor ancak Mac üzerinde çalışmıyor ve yerel olarak mac/python ayarlarını değiştirmek yerine kod üzerinde değişiklik yapmaya çalışıyorum, böylece her yerde çalışacağım ..Python httplib SSL23_GET_SERVER_HELLO: bilinmeyen iletişim kuralı

import ssl 
import httplib 
httplib.HTTPConnection(server, port, timeout) 

ama atar hatası:

[Errno 1] _ssl.c:503: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

şimdi kod kullanmıyor urllib.request kullanmak yerine httplib

Ben varsayılan ayar protokolü, böyle bir şey olarak SSLv3 alacağım böylece kodunu değiştirmek istiyorum:

Etrafa baktı ve birkaç bağlantı ama hiçbir şey çalışıyor bulundu
ssl.SSLContext(ssl.PROTOCOL_SSLv3) 

!

link for python urllib and cURL

this link is for ubuntu

python bug fix, but again for urllib

cevap

7

Not: HTTPSConnection yapıcı Bu durumda kullanılması gereken piton 2.7.9 yana bağımsız değişken olarak, SSL context geçmesine izin verir.

Bu yanıt, değişiklik yapıldığından, bu nedenle yalnızca python'un eski sürümleri için geçerli olduğundan önce gelir.


httplib.HTTPSConnection.connect sadece (python3 passing the SSLContext sağlar) ne yazık ki python2.7 herhangi parametrelerini belirlemek edemez, bir https bağlantısı initalize açıldı soket üzerinde ssl.wrap_socket çağırır.

Eğer protokol sürümünü belirtmek isterseniz, maymun yama gerekiyordu biri bu iki: yama httplib.HTTPSConnection.connect: 1

Yöntem Bu protokol sürümünü değiştirir

import httplib 
import socket 
import ssl 

def connect_patched(self): 
    "Connect to a host on a given (SSL) port." 

    sock = socket.create_connection((self.host, self.port), 
            self.timeout, self.source_address) 
    if self._tunnel_host: 
     self.sock = sock 
     self._tunnel() 
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, 
           ssl_version=ssl.PROTOCOL_SSLv3) 

httplib.HTTPSConnection.connect = connect_patched 

Tüm bağlantılar HTTPSConnection ile yapılmıştır.

Yöntem 2: ssl.wrap_socket yama:

import ssl 

wrap_socket_orig = ssl.wrap_socket 

def wrap_socket_patched(sock, keyfile=None, certfile=None, 
         server_side=False, cert_reqs=ssl.CERT_NONE, 
         ssl_version=ssl.PROTOCOL_SSLv3, ca_certs=None, 
         do_handshake_on_connect=True, 
         suppress_ragged_eofs=True, ciphers=None): 
    return wrap_socket_orig(sock, keyfile, certfile, server_side, 
          cert_reqs, ssl_version, ca_certs, 
          do_handshake_on_connect, 
          suppress_ragged_eofs, ciphers) 

ssl.wrap_socket = wrap_socket_patched 

Bu, wrap_socket kullandığı tüm kod için varsayılan protokol sürümünü değiştirir dolayısıyla da diğer kütüphaneleri etkiler.

düzenleme:

Yöntem 3: httplib aslında ssl sadece wrap_socket erişir, çünkü ayrıca sadece bir sınıf wrap_socket sağlayan httplib.ssl yerini alabilir.functools.partial kullanmak, çok şık bunu yazmak kolaylaştırır:

import httplib 
import ssl 
from functools import partial 

class fake_ssl: 
    wrap_socket = partial(ssl.wrap_socket, ssl_version=ssl.PROTOCOL_SSLv3) 

httplib.ssl = fake_ssl 
+1

ben yöntemi 3 denenmiş ve artık atma "SSL rutinleri: SSL3_GET_RECORD: Yanlış sürüm numarası" ama "openssl s_client -Donanımı ev sahibi tarafından sunucu protokolü kontrol edin: port grep Protokolü "iade ediyor" Protokol: SSLv3 "! Diğer yöntemler ve lyk deneyeceğim .. – Peter

+1

şimdi 3 yöntem hata denedi (tüm yöntemler için) "SSL rutinleri: SSL3_GET_RECORD: yanlış sürüm numarası" – Peter

+0

Yukarıdaki yöntemlerden hangisi olursa olsun, sonuç aynı olmalıdır. kullanın. Farklı protokol kurallarını denediniz mi? Aldığınız hatayı nasıl üreteceğinizden emin değilim. Bir SSLv3 sunucusuna bir TLSv1 istemcisi kullanarak bağlanırken sadece aynı hatayı alıyorum ... – mata

İlgili konular