web-dev-qa-db-ja.com

Python 2.6でTLS 1.2リクエストを送信する

Python 2.6を使用して立ち往生しています。TLS1.2を使用して投稿リクエストを送信する必要があります。Python 2.6のrequestsライブラリはTLSをサポートしていますか? 1.2?リクエストがTLS1.2を介して行われ、他のバージョンでは行われないことを確認/確認するにはどうすればよいですか?

サンプルリクエストは

r=requests.post(url,data=payload,verify=False)

フォーラムのどこかで、これをサポートするにはpyOpenSSLをコンパイルする必要があることを知りました。もっと簡単な方法はありますか?

15
MultipleCrashes

Python 2.6のsslモジュールは、TLS 1.0までしかサポートしていません。追加の依存関係(推奨するpyOpenSSLなど)を導入したくない場合は、次のようにアップグレードする必要があります。 Python 2.7または3.x。TLSの新しいバージョンのサポートを取得します。

Python 2.7.9以降で特定のバージョンのTLSを強制するには、 SSLContext を適切 PROTOCOL_*定数 。その後、独自のSSLContextを提供できる任意のAPIで使用できます。

import ssl
import urllib2

ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# set other SSLContext options you might need
response = urllib2.urlopen(url, context=ctx)

特定のプロトコルバージョン以降(将来のバージョンを含む)を使用するには、ssl.PROTOCOL_SSLv23を使用してから、使用しないプロトコルバージョンを無効にします。

ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)

# allow TLS 1.2 and later
ctx.options |= ssl.OP_NO_SSLv2
ctx.options |= ssl.OP_NO_SSLv3
ctx.options |= ssl.OP_NO_TLSv1
ctx.options |= ssl.OP_NO_TLSv1_1

特定のプロトコルバージョンを強制するために、リクエストでカスタムSSLContextを使用する場合、 ドキュメントによる これを行う方法がないようですドキュメントからの次の例を参照

13
frasertweedale

コードをアップグレードできない場合は、Squidサーバーまたはnginxを使用して接続をプロキシできるはずです。イカの「バンプ」メソッドの例を次に示します。

Squidを使用してクライアントのTLS接続をアップグレードできますか?

もう1つのオプションは、プロキシを維持しながらURL(httpからhttps)を書き換え、アプリケーションがhttpにリクエストを送信するようにすることです(奇妙に見えますが、正しく実装されていれば機能します)。

0
TinuC