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


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

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

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

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

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

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

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

6 58

6 ответов:

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

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

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

  • pyOpenSSL
  • идна

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

  • yum install libffi-devel
  • yum install gcc
  • yum установите openssl-devel
  • pip install urllib3
  • pip install pyopenssl
  • pip install ndg-httpsclient
  • pip установить pyasn1

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

pip install requests[security]

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

" весь модуль ssl Python 3.4 был возвращен для Python 2.7.9. Обоснование см. В ОПТОСОЗ 466."

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

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

Если по причинам развертывания вы предпочитаете стабильную версию запросов, такую как 1.2.3 в pip, вы можете исправить этот патч для работы с 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

скопировать мой ответ из доступ к https-сайтам с IP-адресом

на MAC High Sierra и Python 3.6.4, я попробовал решение:запросы toolbelt: HostHeaderSSLAdapter 1-й, К сожалению, это не работает для меня, тогда я попробовал forcediphttpsadapter, получил это работает, наконец.

автор объясняет все в части readme и предоставил пример сценария, и ему можно легко следовать.

1.Установите библиотека от pip install requests[security] forcediphttpsadapter

2.запустите пример скрипта:

import requests
from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter
session = requests.Session()
session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4'))
response = session.get(
    '/some/path', headers={'Host': 'example.com'}, verify=False)

Примечание: В некоторых случаях может потребоваться удалить префикс: 'www' из url-адреса.