Отправка запроса TLS 1.2 в Python 2.6

Я застрял, используя Python 2.6, и мне нужно отправить запрос на отправку, используя TLS 1.2. Поддерживает ли библиотека Python 2.6 requests поддержку TLS 1.2? Как обеспечить/проверить, что запрос выполняется через TLS1.2, а не какую-либо другую версию?

Образец запроса

r=requests.post(url,data=payload,verify=False)

Где-то на форуме я узнал, что нам нужно скомпилировать pyOpenSSL для поддержки этого. Есть ли более простой способ?

Ответ 1

Модуль ssl в Python 2.6 поддерживает только до TLS 1.0. Если вы не хотите вводить дополнительные зависимости (например, pyOpenSSL, как вы предлагаете), вам нужно будет перейти на Python 2.7 или 3.x, чтобы получить поддержку для новых версий TLS.

Чтобы заставить определенную версию TLS в Python 2.7.9 или новее, построить SSLContext с соответствующую константу PROTOCOL_*. Затем вы можете использовать его с любым API, который позволяет вам предоставить свой собственный SSLContext.

import ssl
import urllib2

ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# set other SSLContext options you might need
response = urllib2.urlopen(url, context=ctx)

Чтобы использовать определенную версию протокола или выше (включая будущие версии), используйте ssl.PROTOCOL_SSLv23, а затем отключите версии протокола, которые вы не хотите использовать:

ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)

# allow TLS 1.2 and later
ctx.options |= ssl.OP_NO_SSLv2
ctx.options |= ssl.OP_NO_SSLv3
ctx.options |= ssl.OP_NO_TLSv1
ctx.options |= ssl.OP_NO_TLSv1_1

Что касается использования пользовательского SSLContext с запросами, чтобы принудительно установить конкретную версию протокола, в соответствии с документацией, не похоже на способ сделать это, см. следующий пример из документации.