Повторное использование HTTPS-сессии в Python - PullRequest
4 голосов
/ 27 июня 2011

Я хотел бы иметь возможность использовать параллельные запросы к HTTPS-серверу. В настоящее время я использую PyCURL, но он не может повторно использовать один и тот же идентификатор сеанса SSL между разными дескрипторами, и каждый дескриптор может позаботиться только об одной загрузке / выгрузке каждый раз.

Принимая во внимание, что согласование требует времени (особенно потому, что используется сертификат клиента), повторное использование идентификатора (как это делают браузеры для параллельной загрузки нескольких ресурсов из Интернета), что, вероятно, повысит производительность.

Итак, кто-нибудь сейчас думает об обходном пути для PyCURL или об альтернативном модуле HTTP, который это поддерживает? httplib, похоже, тоже не работает.

1 Ответ

1 голос
/ 29 июня 2011

Повторное использование идентификаторов сеансов в настоящее время недоступно, как отмечалось здесь , я не слышал ни о каком простом решении для этого - но это просто вопрос сохранения вашего контекста после первоначального рукопожатия и повторное использование

PyOpenSSL раскрывает эти механизмы, но на более низком уровне, чем хотелось бы большинству людей. Я бы положил свои деньги на следующую последовательность событий:

  • Выясните, как сначала выполнить повторное использование сеанса, просто сделайте проверку концепции. Полезным инструментом для этого является двоичный файл openssl (который обычно используют для создания ключей SSL). У него есть встроенный клиент, который вы можете использовать так:

openssl s_client -connect ВЕДУЩИЙ: 443

  • Вы можете распечатать все виды хороших диагностических материалов (например, идентификатор сеанса SSL), чтобы вы могли проверить это за рамками вашей непосредственной проблемы.

  • Как только вы это сделаете, поддержка SSL в httplib довольно проста, HTTPSConnection - это очень тонкая оболочка для HTTPConnection (всего два метода, расширяющих класс. Один из тех, которые вы хотите изменить, это connect .

httplib.py - HTTPSConnection class

    def connect(self):
        "Connect to a host on a given (SSL) port."

        sock = socket.create_connection((self.host, self.port),
                                        self.timeout, self.source_address)
        if self._tunnel_host:
            self.sock = sock
            self._tunnel()
        self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...