использование запросов с 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 ответов:
текущая версия запросов должна быть просто прекрасна с 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."
@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-адреса.