Python запрашивает модуль с использованием TLSv1.2, хотя я указываю TLSv1.1

В настоящее время наш партнер по обработке платежей может поддерживать только TLSv1.1. Переключение процессоров сейчас не вариант.

В Python 2.7.10 у меня есть скрипт, который запрашивает GET с моего веб-сервера разработки, но во время выполнения он использует TLSv1.2 вместо TLSv1.1, как я ему говорю.

import requests
from requests.packages.urllib3.poolmanager import PoolManager
import ssl


class MyAdapter(requests.adapters.HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_TLSv1_1,
        )
        print("poolmanager set")


def do_it():
    with requests.Session() as s:
        s.mount('https://', MyAdapter())
        url = 'https://my.server.com/api/3.0/order/?page=1&limit=10'
        response = requests.get(url, verify=True)
        print("status code: %r" % response.status_code)


if __name__ == '__main__':
    print do_it()

Результат:

poolmanager set
status code: 200

Однако мой журнал доступа к nginx говорит, что использовался протокол TLSv1.2:

127.0.0.1 - [15/Dec/2015:13:38:19 -0600] TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256 "GET /api/3.0/order/?page=1&limit=10 HTTP/1.1" 200 176 "-" "python-requests/2.9.0"

Я изучил скин-документацию по внедрению и монтированию HTTPAdapters с библиотекой запросов и не могу найти ничего, что указывало бы, почему мой клиент использует TLSv1.2 вместо TLSv1.1, как я говорю.


person Rjak    schedule 15.12.2015    source источник
comment
Я думаю, что ssl_verson неверен. Должно быть ssl_version?   -  person rfkortekaas    schedule 15.12.2015
comment
@rfkortekaas Спасибо, что поймали это. Я был уверен, что так и будет, но исправление этой опечатки ничего не изменило. В настоящее время я наблюдаю некоторый успех, используя прямую urllib2, но мне все еще приходится решать проблемы. Я обновлю вопрос сейчас.   -  person Rjak    schedule 15.12.2015
comment
Вам также потребуется s.get для использования объекта сеанса с HTTPadapter.   -  person rfkortekaas    schedule 15.12.2015
comment
@rfkortekaas прав - вы настраиваете сеанс и монтируете адаптер, но затем вы не используете сеанс (поэтому опечатка в аргументе ключевого слова не вызвала ошибку, ваш адаптер никогда не использовался).   -  person Lukas Graf    schedule 16.12.2015
comment
Большое спасибо, ребята. Из документации python-requests неясно, как использовать метод get() сеанса. В этом случае я бы убил за документы API в стиле Java. Эта документация показывает, что метод get вызывается следующим образом: 's.get(url)'. Заменить ли мой вызов request.get() на s.get()? Я попробовал это, и это предсказуемо потерпело неудачу.   -  person Rjak    schedule 17.12.2015
comment
Я был совершенно неправ!!! s.get() работал отлично!! Я изменил свой тестовый сценарий, чтобы использовать SSL3, чтобы вызвать сбой веб-сервера. Это ответ!! Что лучше с точки зрения этикета? Должен ли я ответить на свой вопрос и отдать должное вам, ребята, или позволить одному из вас дать ответ?   -  person Rjak    schedule 17.12.2015
comment
@Rjak да, объект Session запросов - это просто замена API в модуле requests. Вместо requests.post() вы делаете s.post() и т.д.   -  person Lukas Graf    schedule 17.12.2015
comment
Это действительно был @rfkortekaas, который указал на решение, так что я, конечно, не заслуживаю никакой похвалы ;-) Самостоятельно отвечать и отдавать ему должное было бы совершенно нормально, ИМХО, но вы также могли бы дать ему немного времени, чтобы написать свое собственное отвечать. Насколько я знаю, вы также можете изменить принятый ответ позже.   -  person Lukas Graf    schedule 17.12.2015


Ответы (1)


Решение состоит в том, чтобы использовать s.get (сеанс с подключенным HTTPAdapter) вместо request.get.

person rfkortekaas    schedule 17.12.2015
comment
s.get() действует как замена для request.get() в этом контексте. Те же аргументы и тип возвращаемого значения. - person Rjak; 18.12.2015
comment
Можете ли вы опубликовать свой полный пример кода, чтобы заставить это работать? - person twoLeftFeet; 17.04.2019