7

Python 2.7 で urllib2.urlopen() を使用して https リンクを開くために使用されるトランスポート層プロトコルを選択したい

openssl ユーティリティを使用してできることと同様です。

openssl s_client -connect www.google.com:443 -ssl2
openssl s_client -connect www.google.com:443 -ssl3
openssl s_client -connect www.google.com:443 -tls1

動機は、ほとんどのサーバーでハンドシェイクの問題を引き起こす ssl2 プロトコルを使用しないことです。urllib2 は、SSLv2 または SSLv3 を使用する SSLv23 プロトコルを使用しているようで、何らかのメカニズムが機能しません。これがハンドシェイクの問題につながる場合があります

4

1 に答える 1

10

更新: Python 2.7.9 以降、TLS プロトコルを指定してurlopen()機能する SSLContext を渡すことができます。

import ssl
import urllib2

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
# other settings (see ssl.create_default_context() implementation)
urllib2.urlopen('https://example.com', context=context).close()

古い答え:

httplib.HTTPSConnectionSSLバージョンをurllib2.HTTPSHandler変更することはできませんが、変更できます ssl.wrap_socket()

たとえば、次のように、HTTPSHandler任意の引数を渡すことができる独自のものを定義できます。ssl.wrap_socket()urllib2_ssl.py

>>> import ssl
>>> import urllib2
>>> import urllib2_ssl # https://gist.github.com/zed/1347055
>>> opener = urllib2.build_opener(urllib2_ssl.HTTPSHandler(
...     ssl_version=ssl.PROTOCOL_TLSv1, #XXX you need to modify urllib2_ssl
...     ca_certs='cacert.pem')) # http://curl.haxx.se/ca/cacert.pem.bz2
>>> opener.open('https://example.com/').read()
于 2014-03-28T18:21:45.080 に答える