использование запросов с 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 ). Кто-нибудь нашел обходной путь с помощью запросов?


person Massagran    schedule 02.09.2013    source источник
comment
Я отредактировал ответ Lukasa (правильный) для обходного пути, чтобы иметь поддержку SNI в старых запросах, если вы не можете использовать последнюю версию github. Пожалуйста, убедитесь, что в вашей системе установлены необходимые зависимости (не только Python, но и openssl). Он будет доступен после проверки правок :)   -  person AntonioMO    schedule 04.09.2013
comment
Я думаю, что лучше создать новый ответ, чем вносить изменения в чей-то пост.   -  person Lucas Eduardo    schedule 04.09.2013
comment
Что ж, его ответ правильный, поэтому я подумал, что было бы нехорошо иметь еще один ответ для другого случая, лично я действительно предпочитаю, чтобы один ответ содержал всю информацию. Но тогда я опубликую другой ответ.   -  person AntonioMO    schedule 04.09.2013
comment
Интересно, какую операционную систему вы использовали для тестирования? Попадание на хосты SNI работает для меня с Ubuntu Precise, но не с Lucid, и я не могу понять, почему. stackoverflow.com/questions/24522757/   -  person Joe Shaw    schedule 02.07.2014


Ответы (6)


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

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

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

  • pyOpenSSL
  • идна
person Lukasa    schedule 02.09.2013
comment
Спасибо. Я также видел этот запрос на включение github.com/kennethreitz/requests/pull/1347, который вместе с установкой urllib3, ndg-httpsclient и pyasn1 решил это. - person Massagran; 04.09.2013
comment
Ошибка, упомянутая @qarma, отслеживается выпуском 1732 и уже исправлена ​​в мастере. . - person Lukasa; 25.11.2013
comment
Это исправление еще работает? Я получаю [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')]. - person Roman; 27.06.2014
comment
Это исправление абсолютно все еще работает. Похоже, сертификат недействителен. - person Lukasa; 27.06.2014
comment
Для Mac OSX Yosemite вам потребуется pyOpenSSL==0.13. 0.14 мне не подошло. Больше вдохновения на github.com/scrapy/scrapy/issues/922 - person HostedMetrics.com; 08.12.2014
comment
Просто чтобы вы знали, ваш ответ упоминается в этом FAQ - в конце страницы. - person Luís Cruz; 23.05.2015
comment
Установка запросов (2.18) также устанавливает idna. Таким образом, только пакет pyopenssl не устанавливается как зависимость, а требуется для SNI. - person Paweł Bylica; 22.09.2017
comment
Можете ли вы уточнить, что вы имеете в виду, говоря, что с SNI все должно быть в порядке? Вы имеете в виду, что SNI включен по умолчанию, и мне не нужно указывать для него какие-либо параметры? - person user9371654; 09.03.2019

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

  • yum установить libffi-devel
  • ням установить gcc
  • yum установить openssl-devel
  • pip установить urllib3
  • pip установить pyopenssl
  • pip установить ndg-httpsclient
  • пип установить pyasn1
person Shane N    schedule 15.10.2014
comment
Мне также пришлось установить: yum install python-devel, прежде чем переходить к установке pip. - person Kaos; 14.07.2015
comment
На самом деле, для меня ndg-httpsclient установил все эти пакеты Python, кроме urllib3. Однако обратите внимание, чтобы получить последнюю версию pip, иначе она не будет работать. - person Kaos; 14.07.2015
comment
@ihue Эти установки были необходимы много лет назад, чтобы обойти тот факт, что модуль Python SSL в стандартной библиотеке не поддерживал SNI. Это больше не так, и использование новейших версий Python 2 или 3 не требует этих дополнительных установок. - person dpoggi; 09.01.2017

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

pip install requests[security]

person Nandeesh    schedule 03.02.2017
comment
Осторожно, теперь для этого требуется setuptools-rust и поддержка rust. - person progfan; 24.03.2021


Ответ @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
person AntonioMO    schedule 04.09.2013

Скопируйте мой ответ из https://stackoverflow.com/a/51462553/2701959

На MAC High Sierra и Python 3.6.4 я попробовал решение: HostHeaderSSLAdapter Во-первых, к сожалению, у меня это не работает, затем я попробовал https://github.com/Roadmaster/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-адреса.

person Xb74Dkjb    schedule 22.07.2018