Как я могу использовать python httplib для не доверенных сертификатов?
Как я могу использовать python httplib для не доверенных сертификатов? Я создал на моем веб-сервере змеевое масло/самоподписанный сертификат, и мой клиент python не смог подключиться, поскольку я использую ненадежный сертификат.
Я бы довольно проблематично исправить это в своем клиентском коде, а не доверять ему в своей системе.
import httplib
def main():
conn = httplib.HTTPSConnection("127.0.0.1:443")
conn.request("HEAD","/")
res = conn.getresponse()
print res.status, res.reason
data = res.read()
print len(data)
if __name__ == "__main__":
main()
Ответы
Ответ 1
Некоторые мои скрипты перестали работать после обновления моего компьютера. Оказывается, это была проблема: https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection
Изменено в версии 2.7.9: добавлен контекст.
Этот класс теперь выполняет все необходимые проверки сертификата и имени хоста по умолчанию. Чтобы вернуться к предыдущему, непроверенному, поведение ssl._create_unverified_context() может быть передано параметру контекста.
Итак, если ваша версия Python равнa >= 2.7.9 (в моем случае 2.7.10), вы, скорее всего, столкнетесь с этим. Чтобы исправить это, я обновил свой вызов:
httplib.HTTPSConnection(hostname, timeout=5, context=ssl._create_unverified_context())
Это, вероятно, самое простое изменение для сохранения того же поведения.
Ответ 2
Согласно http://docs.python.org/library/httplib.html#httplib.HTTPSConnection
Предупреждение. Это не проверяет сертификат серверов.
Таким образом, вы не можете отключить проверку сертификата, потому что эта функция не включена; -)
Также обратите внимание, что у вас неверные аргументы, с той же страницы:
httplib.HTTPSConnection(host [, port [, key_file [, cert_file [, strict [, timeout [, source_address]]]]]]
Поэтому используйте httplib.HTTPSConnection('127.0.0.1', 443)
Ответ 3
Из проверки исходного кода Python 2.7.14 вы можете установить переменную окружения
PYTHONHTTPSVERIFY=0
и это приведет к отключению проверки сертификата по умолчанию (это будет применяться ко всем запросам от вашей программы).
Я считаю, что это работает с 2.7. 12+ - но это не относится к 3.x.
Ссылка PEP 493. Проверьте HTTPS по умолчанию, но разрешите envvar переопределить это