2012-12-04 116 views
10

今天我遇到了一個有趣的問題。Httplib2 ssl錯誤

我使用的是方正推薦的Python庫httplib2的提高

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 

沒有人知道爲什麼會這樣?

+3

我敢肯定的SSL證書驗證失敗**: - d ** – BorrajaX

回答

20

如果你知道你正在試圖獲得該網站是一個「好人」,你可以嘗試創建你的「開門紅」是這樣的:

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

編輯01:

由於您的問題實際上是爲什麼會發生這種情況,因此您可以檢查thisthis

編輯02:

怎麼看這個答案已經被越來越多的人比我預料的訪問,我想解釋一下禁用證書驗證可能是有用的。

首先,介紹一下這些證書的工作原理。上面提供的鏈接中有相當多的信息,但無論如何,這裏都是這樣。

SSL證書需要由衆所周知的(至少,您的瀏覽器已知)Certificate Authority驗證。你通常從這些機構之一買下整個證書(SymantecGoDaddy ...)

從廣義上說,這個想法是:這些證書頒發機構(CA)給你說也包含CA信息在它的證書。你的瀏覽器有一個知名CA的列表,所以當你的瀏覽器收到一個證書時,它會做類似這樣的事情:「HmmmMMMmmm .... [瀏覽器在這裏製作一個爽朗的臉]...我收到證書,並說它已經過賽門鐵克的驗證,我知道那個「賽門鐵克」的人嗎? [瀏覽器然後進入知名CA的列表並檢查賽門鐵克]哦,是啊!我確定。證書是好的!

您可以看到自己的信息,如果你在瀏覽器中點擊小鎖由URL:

Chrome certificate information

然而,也有你只是想測試的HTTPS案件,您可以使用一對command line工具創建自己的證書頒發機構,並使用該「自定義」CA來簽署剛剛生成的「自定義」證書,對吧?在這種情況下,您的瀏覽器(順便提一句,在問題中是httplib2.Http)不會在可信CA列表中包含您的「自定義」CA,因此它會說該證書是無效的。這些信息仍然會被加密,但是瀏覽器告訴你的是,它並不完全相信那是加密到你認爲正在發生的地方。

例如,假設您創建了一套自定義鍵和CA和所有的曼波巨無霸以下this tutorial爲您localhostFQDN和您的CA證書文件位於當前目錄中。您可以很好地使用您的自定義證書和其他內容在https://localhost:4443上運行服務器。現在,您的CA證書文件位於當前目錄中的文件./ca.crt(與Python腳本將要運行的目錄相同)中。你可以這樣使用:

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

...你不會看到警告了。爲什麼?因爲你告訴去尋找CA的證書./ca.crt

然而,由於鉻(舉一個瀏覽器)不知道該CA的證書,它會認爲它無效:

enter image description here

此外,證書過期。您有機會在一家使用SSL加密的內部網站的公司工作。它可以運行一年,然後你的瀏覽器開始抱怨。你去找負責安全的人,並詢問「喲!我在這裏得到這個警告!發生了什麼事?」答案很可能是「哦,男孩!!我忘了更新證書!沒關係,從現在開始接受它,直到我修好。」(真實的故事,雖然我收到的答案中有swearwords :-D

+3

這真的不是一個好主意 - 你應該確定你的驗證失敗的原因。通過禁用驗證,您實際上將刪除檢測許多中間人攻擊的能力,即有人想模擬上游Foursquare服務器 - 即使他們有這種簡單情況,您也無法檢測到生成一個自簽名證書。 – javanix

+1

備註:對於禁用證書驗證,僅需'h = httplib2.Http(disable_ssl_certificate_validation = True)'。 –

+0

@javanix,因此*如果你知道你想要獲得的網站是一個「好人」...... * – BorrajaX

10

最近版本的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")