Как мне сделать, чтобы Python httplib принимал недоверенные сертификаты? - PullRequest
16 голосов
/ 16 марта 2011

Как мне заставить 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()

Ответы [ 2 ]

43 голосов
/ 24 августа 2015

Некоторые из моих сценариев перестали работать после обновления моего компьютера.Оказывается, это была проблема: https://docs.python.org/2/library/httplib.html#httplib.HTTPSConnection

Изменено в версии 2.7.9: контекст был добавлен.

Этот класс теперь выполняет все необходимые проверки сертификатов и имен хостов по умолчанию,Чтобы вернуться к предыдущему непроверенному поведению, ssl._create_unverified_context () может быть передан в контекстный параметр.

Так что, если ваша версия Python>> 2.7.9 (в моем случае 2.7.10)), вы, вероятно, столкнетесь с этим.Чтобы исправить это, я обновил свой вызов:

httplib.HTTPSConnection(hostname, timeout=5, context=ssl._create_unverified_context())

Это, вероятно, самое простое изменение, чтобы сохранить то же поведение.

5 голосов
/ 17 ноября 2017

Изучив исходный код Python 2.7.14, вы можете установить переменную окружения

PYTHONHTTPSVERIFY=0

, и это приведет к отключению проверки сертификата по умолчанию (это будет применяться ко всем запросам от вашей программы).

Я считаю, что это работает с 2.7.12+ - но это не относится к 3.x.

Ref. PEP 493. Проверьте HTTPS по умолчанию, но позвольте envvar переопределить это https://www.python.org/dev/peps/pep-0493/#feature-environment-based-configuration

...