Как я могу использовать 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 переопределить это