web-dev-qa-db-ja.com

CertificateError:ホスト名が一致しません

プロキシ(企業ファイアウォールの背後)を使用して、httpsドメインにログインしています。 SSLハンドシェイクがうまくいかないようです:

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

私はPython 2.7.9-Mechanizeを使用しています。ログイン、パスワード、セキュリティの質問画面をすべて通過しましたが、認証に引っかかっています。

どんな助けでも素晴らしいでしょう。私はここにあるモンキーレンチを試しました: MechanizeにSSLv3の使用を強制する

ただし、私のコードでは機能しません。

コードファイルが必要な場合は、送信させていただきます。

14
pugmastaflex

このエラーは、sslにサルのパッチを適用することで回避できます。

import ssl
ssl.match_hostname = lambda cert, hostname: True
20
hoju

この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()
4
stvs

私の場合、証明書の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]

これは実際にホスト名が一致するかどうかをチェックします。

4
fabiomaia