2011-11-07 2 views
4

私はPython 2.7を使用していますが、sslv3が必要なウェブページの内容を取得したいと思います。現在、私はエラーSSL23_GET_SERVER_HELLOを取得するページにアクセスしようとすると、ウェブ上でいくつかの検索が私のpython 2.7で同じ効果を得ることができますどのようにPythonの3urllib2を使用してSSLv3暗号化を使用してWebページを取得する方法

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

で物事を修正した後の溶液に私をリードしたときに、 HTTPSHandlerクラスのコンテキスト引数に相当するものを見つけることができないためです。

答えて

0

にそう彼らのアプローチは少し異なっているurlliburllib2のpython 3にマージされていることに注意してください@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も追加されます。また

は、私はこの使用してurllib2の操作を行うことができなかったので、私は最終的に与え、使用に移動

+1

残念ながら、urllib2のとhttplibにssl_versionを指定するように変更して、[のいずれかの検証を行いません。証明書](http://docs.python.org/library/httplib.html#httplib.HTTPSConnection)を使用して、SSL/TLSの使用を安全にします。これを安全に行うには、別のHTTPライブラリーを使用することもできます(HTTPSを使用する場合が多い)。 libcurlのバインディングが気になります。 – Bruno

+0

確かに考慮すべき重要な点 –

+0

私はSSLサポートが利用可能であると理解していますが、SSLv3を必要とするサイトはPythonのバグのために上記のようなエラーを返すでしょう。 –

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()コール

+0

これは古い質問ですが、私はまったく同じ問題を抱えていました。この答えは私の魅力のように働いていました。ありがとう、ここにupvoteです! –

+0

このコードを配置する場所は? – Tommy

関連する問題