Я хочу выбрать протокол безопасности транспортного уровня в urllib2

Я хочу выбрать протокол транспортного уровня, используемый для открытия ссылок https с помощью urllib2.urlopen() в Python 2.7.

Аналогично тому, что мы можем сделать с помощью утилиты 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 использует протокол SSLv23, который использует SSLv2 или SSLv3 с некоторым механизмом падения. Есть случаи, когда это приводит к проблемам рукопожатия

1 ответ

Решение

Обновление: начиная с Python 2.7.9 вы можете передать SSLContext, который определяет протокол TLS для urlopen() функция:

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.HTTPSConnection а также urllib2.HTTPSHandler не разрешать менять версию ssl но 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()
Другие вопросы по тегам