Подтвердить что ты не робот

Использование запросов с TLS не дает поддержки SNI

Я использую запросы для связи с приложением django, но

Когда я пытаюсь

requests.get('https://mysite.com', verify=True)

Я получаю сообщение об ошибке:

имя хоста 'mysite.com' не соответствует ни одному из '*.myhost.com', 'myhost.com'

Однако, когда я смотрю на браузер, или http://www.digicert.com/help/, сертификат выглядит отлично и dandy.

Мой хост предположил, что отсутствие поддержки SNI от запросов (и Github, похоже, подтверждает, что https://github.com/kennethreitz/requests/issues/749). Кто-нибудь нашел работу с использованием запросов?

4b9b3361

Ответ 1

Текущая версия запросов должна быть в порядке с SNI. Далее по вопросу GitHub вы можете увидеть требования:

Попробуйте установить эти пакеты, а затем сделайте еще один снимок.

EDIT: по запросу v2.12.1 ndg-httpsclient и pyasn1 больше не требуются. Полный список необходимых пакетов теперь:

  • pyOpenSSL
  • IDNA

Ответ 2

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

  • yum install libffi-devel
  • yum install gcc
  • yum install openssl-devel
  • pip install urllib3
  • pip install pyopenssl
  • pip install ndg-httpsclient
  • pip install pyasn1

Ответ 3

Установите модуль запросов запросов следующим образом. Это позволит установить дополнительные пакеты безопасности.

pip install requests[security]

Ответ 4

Или вы можете просто использовать Python 2.7.9 и выше:

"Весь модуль Python 3.4 ssl был передан для Python 2.7.9. Для получения обоснования см. PEP 466.

https://www.python.org/downloads/release/python-279/

Ответ 5

@Ответ Lukasa правильный с настоящими (из github) запросов. Не забудьте добавить OpenSSL в вашу систему, кроме тех зависимостей, которые он упоминает.

Если по причинам развертывания вы предпочитаете стабильную версию запросов, например, 1.2.3 в пипе, вы можете обезьянную патч, чтобы работать со SNI следующим образом:

import requests


def fileno(self):
    return self.socket.fileno()


def close(self):
    return self.connection.shutdown()


requests.pyopenssl.WrappedSocket.close = close
requests.pyopenssl.WrappedSocket.fileno = fileno