certification validation
内部企業リンクを使用してサーバーへの要求を無視したい。
Pythonrequests
ライブラリを使用すると、次のようになります。
r = requests.get(link, allow_redirects=False,verify=False)
urllib2 ライブラリで同じことを行うにはどうすればよいですか?
certification validation
内部企業リンクを使用してサーバーへの要求を無視したい。
Pythonrequests
ライブラリを使用すると、次のようになります。
r = requests.get(link, allow_redirects=False,verify=False)
urllib2 ライブラリで同じことを行うにはどうすればよいですか?
それまでの間、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 コンストラクターを直接呼び出すことも機能するはずです。私はそれを試していません。
オープナーを使用する人は、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
ます。ここでは、デフォルトのものではなく独自のものを指定するだけです。
@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を使用します。これはドキュメントに記載されているためです。他のプロトコルも機能する可能性がありますが、マシンとリモート サーバーによって異なります。詳細についてはドキュメントを確認してください。