プロキシ(企業ファイアウォールの背後)を使用して、httpsドメインにログインしています。 SSLハンドシェイクがうまくいかないようです:
CertificateError: hostname 'ats.finra.org:443' doesn't match 'ats.finra.org'
私はPython 2.7.9-Mechanizeを使用しています。ログイン、パスワード、セキュリティの質問画面をすべて通過しましたが、認証に引っかかっています。
どんな助けでも素晴らしいでしょう。私はここにあるモンキーレンチを試しました: MechanizeにSSLv3の使用を強制する
ただし、私のコードでは機能しません。
コードファイルが必要な場合は、送信させていただきます。
このエラーは、sslにサルのパッチを適用することで回避できます。
import ssl
ssl.match_hostname = lambda cert, hostname: True
このssl.math_hostnameのバグはv2.7.9で発生し(2.7.5にはありません)、hostname:port構文からホスト名を削除しないことに関係しています。次の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
次の機械化コードが機能するはずです。
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()
私の場合、証明書のDNS名は::1
(ローカルテスト目的)およびホスト名の検証が失敗しました
ssl.CertificateError: hostname '::1' doesn't match '::1'
それをいくらか適切に修正するために、サルにパッチを当てましたssl.match_hostname
と
import ssl
ssl.match_hostname = lambda cert, hostname: hostname == cert['subjectAltName'][0][1]
これは実際にホスト名が一致するかどうかをチェックします。