2015-02-27 14 views
6

Ich benutze einen Proxy (hinter Corporate Firewall), um sich in eine https-Domain einzuloggen. Der SSL-Handshake scheint nicht gut zu laufen:CertificateError: Hostname passt nicht

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

Ich bin mit Python 2.7.9 - Mechanize und ich habe Vergangenheit all die Login, Passwort, Sicherheit questioon Bildschirm bekommen, aber es wird immer aufgehängt auf die Zertifizierung.

Jede Hilfe wäre erstaunlich. Ich habe den monkeywrench hier gefunden: Forcing Mechanize to use SSLv3

Funktioniert nicht für meinen Code obwohl.

Wenn Sie die Codedatei möchten, würde ich gerne senden.

+0

können Sie die meisten Ihrer 'Affen-Patch' Code, vielleicht kann dies Sie helfen http://stackoverflow.com/questions/28282797/feedparser-parse-ssl-certificate-verify-failed – cmidi

+1

Es könnte interessant sein zu sehen, der Code, den Sie verwenden. Es kann einfach sein, dass Sie "host: port" angeben, wo stattdessen nur der Hostname erwartet wird, so dass er den falschen Namen (d. H. "Host: port" anstelle von "host") für die Überprüfung des Hostnamens verwendet. Ich bin mir sicher, dass es nichts mit SSLv3 zu tun hat. –

+0

Hi @cmidi danke für deine Antwort. Ich werde diesen Code am Montag ausprobieren. – pugmastaflex

Antwort

3

Dieser Fehler in ssl.math_hostname erscheint in v2.7.9 (es ist nicht in 2.7.5) und hat damit zu tun, den Hostnamen nicht aus der hostname: port-Syntax zu entfernen. Das folgende Neuschreiben von ssl.match_hostname behebt den Fehler. Setzen Sie diese vor Ihrer mechanize Code:

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 

Der Code folgende mechanisieren sollte jetzt funktionieren:

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

Wird der Fehler irgendwo gemeldet? Können wir bitte einen Link haben? Ist es in den neueren Versionen behoben? – geckon

4

Sie diesen Fehler durch Affe Patchen ssl vermeiden:

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

In meinem Fall die Der DNS-Name des Zertifikats war ::1 (für lokale Testzwecke) und die Überprüfung des Hostnamens war mit

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

Um es zu beheben etwas richtig ich Affe ssl.match_hostname mit

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

geflickt, die, wenn die Host-Namen Spiel tatsächlich überprüft.