2011-11-07 67 views
4

我正在使用python 2.7,並且想要獲取需要sslv3的網頁的內容。目前,當我嘗試訪問的頁面出現錯誤SSL23_GET_SERVER_HELLO,並在網絡上一些搜索引我到下面的解決方案,解決在Python 3如何使用urllib2獲取使用SSLv3加密的網頁

urllib.request.install_opener(urllib.request.build_opener(urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_TLSv1)))) 

事情,我怎樣才能在Python 2.7相同的效果,因爲我似乎無法找到HTTPSHandler類的上下文參數的等價物。

回答

0

因爲我無法做到這一點使用的urllib2,我最終放棄並移動到使用像@Bruno這樣的libCurl綁定在評論中建議pastylegs的答案。

0

SSL應自動只要你have the SSL libraries installed on your server(即你不應該有specificially其添加爲處理器)進行處理

http://docs.python.org/library/urllib2.html#urllib2.build_opener 

如果Python安裝有支持SSL(即,如果ssl模塊可以導入),HTTPSHandler也會被添加。

另外,還要注意urlliburllib2已經在Python 3已經合併,使他們的做法是有點不同

+1

不幸的是,urllib2的和httplib的[不做任何覈查證書](http://docs.python.org/library/httplib.html#httplib.HTTPSConnection),這使得SSL/TLS不安全。如果您想要安全地使用這個HTTP庫(這往往是使用HTTPS的要點),您可能需要使用另一個HTTP庫。想到libcurl綁定。 – Bruno

+0

當然要考慮的重要一點 –

+0

我明白ssl支持是可用的,但是需要SSLv3的站點會因爲python中的錯誤返回上面提到的錯誤,或者這是Google搜索告訴我的。 –

2

我意識到這個響應已經晚了幾年,但我也遇到了同樣的問題,並且不想依賴libcurl被安裝在我運行這個的機器上。希望這對未來找到這篇文章的人有用。

問題是httplib.HTTPSConnection.connect沒有指定SSL上下文或版本的方法。在您點擊腳本的內容以獲得快速解決方案之前,您可以覆蓋此功能。

一個重要的考慮因素是,如上所述,此解決方法不會驗證服務器證書的有效性。

import httplib 
import socket 
import ssl 
import urllib2 

def connect(self): 
    "Connect to a host on a given (SSL) port." 

    sock = socket.create_connection((self.host, self.port), 
            self.timeout, self.source_address) 
    if self._tunnel_host: 
     self.sock = sock 
     self._tunnel() 

    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1) 

httplib.HTTPSConnection.connect = connect 

opener = urllib2.build_opener() 
f = opener.open('https://www.google.com/') 

*注:此替代connect()功能是複製/粘貼httplib.py,並簡單地修改了wrap_socket()調用指定ssl_version

+0

我意識到這是一個古老的問題,但我遇到了完全相同的問題,這個答案對我來說就像一個魅力。謝謝,這裏有一個upvote! –

+0

放置此代碼的位置? – Tommy