2016-11-02 2 views
3

Usecase:Pythonリクエストモジュールでホスト名がサポートする暗号の数を調べたいと思います。Pythonリクエストモジュール経由でリクエストを送信する際に特定の暗号を選択する方法

リクエストモジュールフックに暗号名を指定する方法が見つかりません。誰もが暗号を指定する方法を提供する方法を提案することができます。

import ssl 

from requests.adapters import HTTPAdapter 
from requests.packages.urllib3.poolmanager import PoolManager 


class Ssl3HttpAdapter(HTTPAdapter): 
    """"Transport adapter" that allows us to use SSLv3.""" 

    def init_poolmanager(self, connections, maxsize, block=False): 
     self.poolmanager = PoolManager(
      num_pools=connections, maxsize=maxsize, 
      block=block, ssl_version=ssl.PROTOCOL_SSLv3) 

答えて

1

バージョン2.12.0+要求を使用している場合は、あなたが(SSLContextの設定OPが尋ねた後で、このブログの記事が書かれたことに注目することができるようにする新機能について説明しConfiguring TLS With Requests上のブログの記事があり、質問):

要求しv2.12.0で追加された機能はurllib3が今のConnectionPoolオブジェクトのコンストラクタに SSLContextオブジェクトを受け入れることです。この SSLContextは、基盤となるTLS 接続のファクトリとして使用されるため、適用されるすべての設定は、これらの低レベル接続の にも適用されます。

これを行う最善の方法は、SSLContextファクトリ関数 requests.packages.urllib3.util.ssl_.create_urllib3_contextを使用することです。これはPythonのssl.create_default_context関数に似ている ですが、 には、Requestsとurllib3がともに使用するより厳密なデフォルトTLS設定が適用されます。 この関数は、 にさらに設定を適用できるSSLContextオブジェクトを返します。さらに、 の関数は、デフォルト設定を上書きできるようにいくつかの引数をとります。

新しいSSLContextオブジェクトを提供するには、特定のホストに適切な TransportAdapterを記述する必要があります。

次のサンプルコードは、このメソッドを使用してリクエストで3DESを再度有効にする方法の例として示されています。

import requests 
from requests.adapters import HTTPAdapter 
from requests.packages.urllib3.util.ssl_ import create_urllib3_context 

# This is the 2.11 Requests cipher string, containing 3DES. 
CIPHERS = (
    'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:' 
    'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:' 
    '!eNULL:!MD5' 
) 


class DESAdapter(HTTPAdapter): 
    """ 
    A TransportAdapter that re-enables 3DES support in Requests. 
    """ 
    def init_poolmanager(self, *args, **kwargs): 
     context = create_urllib3_context(ciphers=CIPHERS) 
     kwargs['ssl_context'] = context 
     return super(DESAdapter, self).init_poolmanager(*args, **kwargs) 

    def proxy_manager_for(self, *args, **kwargs): 
     context = create_urllib3_context(ciphers=CIPHERS) 
     kwargs['ssl_context'] = context 
     return super(DESAdapter, self).proxy_manager_for(*args, **kwargs) 

s = requests.Session() 
s.mount('https://some-3des-only-host.com', DESAdapter()) 
r = s.get('https://some-3des-only-host.com/some-path') 

ありますがgithub pages for the requests module上で読むことができる可能ハックが、またある、またはhttps://stackoverflow.com/a/32651967/2364215ではなく、それはとして、私はそれをお勧めしません(どちらも要求モジュールの作者をしない、基礎となるライブラリコードを修正あなたはそのページにあります)。一方、古いリクエストパッケージを使用しており、アップグレードできない場合は、最善の選択肢かもしれません。それはurllib3モジュールのDEFAULT_CIPHERSを上書きになる:

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':RC4-SHA' 

あなたが変更を行った後に要求モジュールを使用する他のコードを持っていますが、変更を必要としない場合、あなたはその前の値にDEFAULT_CIPHERSを復元することもできます。

関連する問題