63

certification validation内部企業リンクを使用してサーバーへの要求を無視したい。

Pythonrequestsライブラリを使用すると、次のようになります。

r = requests.get(link, allow_redirects=False,verify=False)

urllib2 ライブラリで同じことを行うにはどうすればよいですか?

4

6 に答える 6

149

それまでの間、urllib2 はデフォルトでサーバー証明書を検証するようです。過去に表示された警告は 2.7.9で消え、現在、自己署名証明書(およびPython 2.7.9)を使用したテスト環境でこの問題に遭遇しました。

私の邪悪な回避策(本番環境ではこれを行わないでください!):

import urllib2
import ssl

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

urllib2.urlopen("https://your-test-server.local", context=ctx)

ドキュメントによると、 SSLContext コンストラクターを直接呼び出すことも機能するはずです。私はそれを試していません。

于 2015-01-20T14:49:15.490 に答える
33

オープナーを使用する人は、Enno Gröper の素晴らしい回答に基づいて同じことを達成できます。

import urllib2, ssl

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx), your_first_handler, your_second_handler[...])
opener.addheaders = [('Referer', 'http://example.org/blah.html')]

content = opener.open("https://localhost/").read()

そして、以前のようにそれを使用してください。

build_openerおよびHTTPSHandler に従って、モジュールが存在する場合は HTTPSHandler が追加されsslます。ここでは、デフォルトのものではなく独自のものを指定するだけです。

于 2016-03-04T15:13:55.287 に答える
7

@Enno Gröper の投稿によると、私は SSLContext コンストラクターを試しましたが、私のマシンではうまく動作します。以下のようなコード:

import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
urllib2.urlopen("https://your-test-server.local", context=ctx)

オープナーが必要な場合は、次のようなコンテキストを追加してください:

opener = urllib2.build_opener(urllib2.HTTPSHandler(context=ctx))

注: 上記のテスト環境はすべて python 2.7.12です。ここではPROTOCOL_SSLv23を使用します。これはドキュメントに記載されているためです。他のプロトコルも機能する可能性がありますが、マシンとリモート サーバーによって異なります。詳細についてはドキュメントを確認してください。

于 2018-03-22T07:03:50.657 に答える