2015-02-27 21 views
6

Używam proxy (za zaporą firmową), aby zalogować się do domeny https. Uzgadnianie SSL nie wydaje się iść dobrze:CertificateError: nazwa hosta nie pasuje

CertificateError: hostname 'ats.finra.org:443' doesn't match 'ats.finra.org' 

używam Python 2.7.9 - Mechanize i stałam obok wszystkich ekranach login, hasło, questioon bezpieczeństwo, ale jest coraz powiesił się na certyfikacji.

Każda pomoc będzie niesamowita. Spróbowałem znalezionego tutaj monkeywrench: Forcing Mechanize to use SSLv3

Nie działa jednak dla mojego kodu.

Jeśli chcesz plik kodu, z chęcią bym go wysłał.

+0

Czy możesz większość swojego kodu 'monkey-patch', może to ci pomoże http://stackoverflow.com/questions/28282797/feedparser-parse-ssl-certyfikat-verify-failed – cmidi

+1

To może być interesujące zobaczyć kod, którego używasz. Może to być po prostu podanie "host: port", gdzie zamiast tego oczekiwana jest tylko nazwa hosta, aby używał niewłaściwej nazwy (tj. "Host: port" zamiast "hosta") do weryfikacji nazwy hosta. Jestem pewien, że nie ma to nic wspólnego z SSLv3. –

+0

Witam @cmidi, dziękuję za odpowiedź. Spróbuję tego kodu w poniedziałek. – pugmastaflex

Odpowiedz

3

Ten błąd w ssl.math_hostname pojawia się w v2.7.9 (nie jest to w 2.7.5), i ma do czynienia z nieodbieraniem nazwy hosta ze składni hostname: port. Poniższe przepisanie ssl.match_hostname naprawia błąd. Umieścić to przed kodem Mechanize:

import functools, re, urlparse 
import ssl 

old_match_hostname = ssl.match_hostname 

@functools.wraps(old_match_hostname) 
def match_hostname_bugfix_ssl_py_2_7_9(cert, hostname): 
    m = re.search(r':\d+$',hostname) # hostname:port 
    if m is not None: 
     o = urlparse.urlparse('https://' + hostname) 
     hostname = o.hostname 
    old_match_hostname(cert, hostname) 

ssl.match_hostname = match_hostname_bugfix_ssl_py_2_7_9 

Poniższy mechanizacji kod powinien działać:

import mechanize 
import cookielib 

br = mechanize.Browser() 

# Cookie Jar 
cj = cookielib.LWPCookieJar() 
br.set_cookiejar(cj) 

# Browser options 
br.set_handle_equiv(True) 
br.set_handle_gzip(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

# Follows refresh 0 but not hang on refresh > 0 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 

br.addheaders = [('User-Agent', 'Nutscrape 1.0')] 
# Use this proxy 
br.set_proxies({"http": "localhost:3128", "https": "localhost:3128"}) 
r = br.open('https://www.duckduckgo.com:443/') 
html = br.response().read() 
# Examine the html response from a browser 
f = open('foo.html','w') 
f.write(html) 
f.close() 
+3

Czy błąd jest zgłaszany gdzieś? Czy możemy uzyskać link? Czy jest on poprawiony w nowszych wersjach? – geckon

4

Można uniknąć tego błędu przez małpy krosowe ssl:

import ssl 
ssl.match_hostname = lambda cert, hostname: True 
0

w moim przypadku nazwa DNS certyfikatu: ::1 (dla lokalnych testów) i weryfikacja nazwy hosta nie powiodła się z

ssl.CertificateError: hostname '::1' doesn't match '::1' 

go naprawić nieco właściwie ja małpa połatany ssl.match_hostname z

import ssl                                                
ssl.match_hostname = lambda cert, hostname: hostname == cert['subjectAltName'][0][1] 

Które faktycznie sprawdza czy meczu hostów.