CertificateError:hostname不匹配

pug*_*lex 11 python ssl mechanize mechanize-python

我正在使用代理(在公司防火墙后面)登录到https域.SSL握手似乎进展不顺利:

CertificateError: hostname 'ats.finra.org:443' doesn't match 'ats.finra.org' 
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 2.7.9 - Mechanize,我已经通过了所有的登录,密码,安全问题屏幕,但它正在挂起认证.

任何帮助都会很棒.我试过在这里找到的monkeywrench:强制Mechanize使用SSLv3

但是对我的代码不起作用.

如果你想要我愿意发送的代码文件.

hoj*_*oju 19

你可以通过猴子修补ssl来避免这个错误:

import ssl
ssl.match_hostname = lambda cert, hostname: True
Run Code Online (Sandbox Code Playgroud)


fab*_*aia 5

在我的例子中,证书的 DNS 名称是::1(用于本地测试目的),主机名验证失败,并显示

ssl.CertificateError: hostname '::1' doesn't match '::1'
Run Code Online (Sandbox Code Playgroud)

为了正确修复它,我ssl.match_hostname用猴子修补了

import ssl                                                                                                                                                                                             
ssl.match_hostname = lambda cert, hostname: hostname == cert['subjectAltName'][0][1]
Run Code Online (Sandbox Code Playgroud)

它实际上检查主机名是否匹配。


小智 4

ssl.math_hostname 中的此错误出现在 v2.7.9 中(2.7.5 中没有),并且与未从主机名:端口语法中删除主机名有关。以下对 ssl.match_hostname 的重写修复了该错误。将其放在机械化代码之前:

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
Run Code Online (Sandbox Code Playgroud)

以下机械化代码现在应该可以工作:

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()
Run Code Online (Sandbox Code Playgroud)

  • 该错误是否在某处报告?我们可以给个链接吗?新版本中修复了吗? (4认同)