2011-11-04 27 views
1

我正在使用httplib2打開ssl連接。以下是代碼。使用httplib2打開ssl連接時出錯

import httplib2 

if __name__=='__main__': 
    conn = httplib2.Http(disable_ssl_certificate_validation=True) 
    conn.add_certificate('serverkey.pem', 'servercert.pem', '') 
    resp, content = conn.request(uri = 'https://xxx.xxx.xxx.xxx:xxxx/Konfigurator 
        /REST/login?userName=xxx&pass=xxx', method = 'POST') 
    print resp 

這是我得到的錯誤。

Traceback (most recent call last): 
File "C:\eclipse-workspace\REST\src\examples.py", line 7, in <module> 
resp, content = conn.request(uri = 'https://xxx.xxx.xxx.xxx:xxx/Konfigurator/REST/login?userName=xxx&pass=xxx', method = 'POST') 
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1437, in request 
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) 
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1189, in _request 
(response, content) = self._conn_request(conn, request_uri, method, body, headers) 
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1163, in _conn_request 
conn.connect() 
File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 925, in connect 
raise socket.error, msg 
socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host 

代碼是否正確或我在這裏丟失了什麼?

回答

2

我明白了。問題是服務器僅支持TLSv1和SSLv3加密。如果沒有指定版本,httplib2模塊默認爲SSLv23。這導致服務器響應RST數據包。可能是他們的代碼中的一個錯誤。在他們的init .py中進行了更改,以在wrap_socket函數中包含「ssl_version = 3」(3代表TLS)並且它工作正常。

1

您的代碼似乎是正確的,即下面的簡化版本是正確能夠得到谷歌的HTTPS頭版:

>>> import httplib2 
... from pprint import pprint 
... conn = httplib2.Http() 
... resp, content = conn.request(uri="https://encrypted.google.com") 
... pprint(resp) 
{'cache-control': 'private, max-age=0', 
'content-location': 'https://encrypted.google.com', 
'content-type': 'text/html; charset=ISO-8859-1', 
'date': 'Fri, 04 Nov 2011 09:56:58 GMT', 
'expires': '-1', 
'server': 'gws', 
'set-cookie': 'PREF=ID=efe3264c0da8b563:FF=0:TM=1320400618:LM=1320400618:S=AsZHdP7eQQXrsYOw; expires=Sun, 03-Nov-2013 09:56:58 GMT; path=/; domain=.google.com, NID=52=RJx7UWMiVEQGLvS3nVLz4iit6Z-V0pMSXzbReygHwJVt40kg4rhs1NS2U025XEyz_0ajtbGhsUDqbqIK5gje16sxka4sStsV4KmQRPOnbpNoeL4mN9Nge-NSEoziU8yH; expires=Sat, 05-May-2012 09:56:58 GMT; path=/; domain=.google.com; HttpOnly', 
'status': '200', 
'transfer-encoding': 'chunked', 
'x-frame-options': 'SAMEORIGIN', 
'x-xss-protection': '1; mode=block'} 

所以我猜你的證書導致遠程服務器BARF,強行斷開會話。你是否控制服務器,如果有,是否有服務器上的日誌或診斷信息?

其實,仔細看,我試圖理解你的「add_certificate」調用。你爲什麼要將特定的IP地址指定爲證書的域名?服務器的密鑰是否代表該IP地址?你嘗試過一個空字符串嗎?

+0

我能夠在wireshark中執行數據包捕獲。但它是加密的。無論如何都要將這些證書放入wireshark中,以便它可以解密它。 – n3o

+0

你是否使用Google?我認爲這是通過這個過程的步驟;忽略所有IIS絨毛。 http://htluo.blogspot.com/2009/01/decrypt-https-traffic-with-wireshark.html –

+0

就域名而言,我沒有一個。它是我們網絡中的本地設備,我們只是將其IP用於測試目的。無論如何,我已經刪除,並把它留空。另外,當嘗試連接而不使用任何證書時,我會得到完全相同的錯誤。所以我認爲這裏存在根本錯誤。 – n3o