2

mechanize を使用して Python で SSL URL を開くにはどうすればよいですか?

次のように、UbuntuでPython 2.7.3を使用して簡単なページ取得を試みています。

import mechanize
browser = mechanize.Browser()
resp = browser.open('https://mydomain.com')

しかし、それはエラーをスローします:

urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:140773E8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)>

奇妙なことに、Fedora の Python 2.6.4 で同じコードを実行しても、このエラーは発生しません...

おそらく、これは mechanize の直接的な問題ではなく、urllib2 と基盤となる SSL C ライブラリの問題です。ググってもほとんどヒットしません。回避策はありますか?

編集: 私はこの古いバグレポートを見つけ、推奨される回避策 (基本的に Python は SSLv3 のみのサイトに SSLv23 を使用しようとしています) を見つけましたが、そのコードは代わりにエラーになりますhttplib.BadStatusLine: ''

4

1 に答える 1

-1

この問題は、Web サーバーで SSLv2 が無効になっていることが原因である可能性がありますが、Python 2.x はデフォルトで PROTOCOL_SSLv23 との接続を確立しようとします。これはhttps://github.com/python/cpython/blob/master/Lib/ssl.py#L867で発生します

Python ライブラリ モジュールをコピーして編集する代わりに、ssl_version キーワード パラメータをオーバーライドして、ssl モジュールの ssl.wrap_socket() にモンキー パッチを適用できます。次のコードはそのまま使用できます。リクエストを行う前に、これをプログラムの最初に置いてください。

import ssl
from functools import wraps
def sslwrap(func):
    @wraps(func)
    def bar(*args, **kw):
        kw['ssl_version'] = ssl.PROTOCOL_TLSv1
        return func(*args, **kw)
    return bar

ssl.wrap_socket = sslwrap(ssl.wrap_socket)
于 2014-06-12T03:11:13.057 に答える