Ошибка протокола SSL Httplib2

сегодня я столкнулся с одним интересным вопросом.

Я использую рекомендованную Foursquare библиотеку python httplib2 raise

SSLHandshakeError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed'),) 

при попытке запросить токен oauth

response, body = h.request(url, method, headers=headers, body=data)

на

_process_request_with_httplib2 function

кто-нибудь знает, почему это происходит?

2 ответов


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

import httplib2
if __name__ == "__main__":
    h = httplib2.Http(".cache", disable_ssl_certificate_validation=True)
    resp, content = h.request("https://site/whose/certificate/is/bad/", "GET")

(самая интересная часть -disable_ssl_certificate_validation=True )

документы: http://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http

EDIT 01:

так как ваш вопрос был на самом деле, почему это происходит, вы можете проверить этой или этой.

EDIT 02:

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

во-первых, немного светлого фона о том, как работают эти сертификаты. В ссылках, приведенных выше, довольно много информации,но здесь все равно.

сертификаты SSL должны быть проверены хорошо известно (по крайней мере, хорошо известно вашему браузеру) Сертификат. Вы обычно покупаете весь сертификат у одного из этих органов (Symantec, GoDaddy...)

вообще говоря, идея такова: эти центры сертификации (CA) дают вам сертификат, который также содержит информация CA в нем. У ваших браузеров есть список известных CAs, поэтому, когда ваш браузер получает сертификат, он будет делать что-то вроде: "HmmmMMMmmm.... [браузер делает супициозное лицо здесь]... Я получил сертификат, и он говорит, что он проверен Symantec. Я знаю этого парня из Symantec? [затем браузер переходит к своему списку известных CAs и проверяет наличие Symantec]О, да! Я делаю. Хорошо, сертификат хорош!

вы можете увидеть эту информацию самостоятельно, если вы нажмете на маленькую блокировку по URL-адресу в вашем браузер:

Chrome certificate information

однако есть случаи, когда вы просто хотите проверить HTTPS, и вы создаете свой собственный центр сертификации, используя пару командная строка tools и вы используете этот" пользовательский "CA, чтобы подписать" пользовательский " сертификат, который вы только что создали, верно? В таком случае Ваш браузер (который, кстати, в вопросе стоит httplib2.Http) не будет иметь ваш "пользовательский" CA среди списка доверенных CAs, поэтому это скажем, что сертификат недействителен. Информация по-прежнему будет путешествовать в зашифрованном виде, но браузер говорит вам, что он не полностью доверяет тому, что путешествует в зашифрованном виде туда, куда вы предполагаете, что он собирается.

например, предположим, вы создали набор пользовательских ключей и CAs и все мамбо-Джамбо следующие в этом уроке для localhost FQDN и что ваш файл сертификата CA находится в текущем каталоге. У вас вполне может быть сервер, работающий на https://localhost:4443 использование пользовательских сертификатов и еще много чего. Теперь ваш файл сертификата CA находится в текущем каталоге, в файле ./ca.crt (в том же каталоге будет запущен ваш скрипт Python). Вы могли бы использовать httplib2 такой:

h = httplib2.Http(ca_certs='./ca.crt')
response, body = h.request('https://localhost:4443')
print(response)
print(body)

... и ты больше не увидишь предупреждения. Почему? Потому что ты сказал httplib2 искать сертификат CA в ./ca.crt)

однако, так как Chrome (чтобы привести браузер) не знает о сертификате ЦС, он будет считать его недействительным:

enter image description here

кроме того, срок действия сертификатов истекает. Есть вероятность, что вы работаете в компании, которая использует внутренний сайт с SSL-шифрованием. Он работает нормально в течение года, а затем браузер начинает возмущаться. Вы идете к человеку, который отвечает за безопасность, и спросить "Йо!! Я получил это предупреждение здесь! Что происходит?" и ответ может очень хорошо будь "Боже!! Я забыл продлить сертификат! Все в порядке, просто прими это сейчас, пока я не исправлю это." (правдивая история, хотя в ответе были ругательства, которые я получил : - D )


последние версии httplib2 по умолчанию для собственного хранилища сертификатов.

# Default CA certificates file bundled with httplib2.
CA_CERTS = os.path.join(
     os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")

Если вы используете ubuntu / debian, вы можете явно передать путь к файлу системного сертификата, например

httplib2.HTTPSConnectionWithTimeout(HOST, ca_certs="/etc/ssl/certs/ca-certificates.crt")