2016-07-21 4 views
3

Pythonのリクエストライブラリを使用してPOST呼び出しをサーバーに送信しようとしています。以前はPOSTコールを正常に送信できましたが、最近、サーバーはTLSv1.0を廃止し、TLSv1.1およびTLSv1.2のみをサポートしています。今、同じコードが私に "requests.exceptions.SSLError:EOFプロトコル(_ssl.c:590)違反で発生しました"というエラーがスローされます。要求ライブラリがPythonでTLSv1.1またはTLSv1.2を使用するように強制する

私たちはセッションオブジェクトがTLSv1のを使用するまでのHTTPアダプタをサブクラス化する必要があると述べているstackoverflowのPython Requests requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocolにこのスレッドを見つけました。私はそれに応じて自分のコードを変更し、ここに私の新しいコード

class MyAdapter(HTTPAdapter): 
    def init_poolmanager(self, connections, maxsize, block=False): 
    self.poolmanager = PoolManager(num_pools=connections, 
           maxsize=maxsize, 
           block=block, 
           ssl_version=ssl.PROTOCOL_TLSv1) 

url="https://mywebsite.com/ui/" 
headers={"Cookie":"some_value","X-CSRF-Token":"some value","Content-Type":"application/json"}  
payload={"name":"some value","Id":"some value"}  
s = requests.Session() 
s.mount('https://', MyAdapter()) 

r=s.post(url,json=payload,headers=headers) 
html=r.text 
print html 

ですが、でも、これを使用した後、私は同じエラーが「EOFは、プロトコル(_ssl.c:590)に違反して発生しました」を取得します。

私の最初の質問は、私はどこかで、デフォルトでsslを使用してリクエストを読むことです。 TLSv1.0はssl3.0と下位互換性があるので、私のサーバはTLSv1.0を使用していたことを知っています。

私の2番目の質問は、上記で私がHTTPAdapterをサブクラス化するために私のコードを変更したことを使用して述べたstackoverflowスレッドは、これはTLSv1のために働くと言いました。しかし、TLSv1.0は私のサーバーでは廃止されているので、このコードはまだ動作しますか?

答えて

4

TLSスタックは、自動的に利用可能な最高のバージョンを使用します。サーバーでTLS 1.0のサポートが無効になっているときにTLS 1.0のサポートが無効になった場合は、ローカルのTLSスタックがTLS 1.2などの新しいプロトコルバージョンをサポートしていないことを意味します。これは、Mac OS Xの場合、OpenSSL(0.9.8)の腐った古いバージョンが同梱されているため、よくあることです。この場合、Pythonコードは問題を回避するのに役立ちますが、OpenSSLの新しいバージョンを使用するPythonを入手する必要があります。

あなたのpythonの中に以下のコマンドを実行使用しているopensslのバージョンを確認するには、次の

import ssl 
print ssl.OPENSSL_VERSION 

を使用すると、OpenSSLのバージョン1.0.2または1.0.1を必要とするTLS 1.2のサポートを持っているために。 1.0.0または0.9.8のみの場合は、Python + OpenSSLをアップグレードする必要があります。これを行う方法の詳細については、Updating openssl in python 2.7を参照してください。

+0

あなたが言及したリンクを使用してopensslバージョンを更新しました。しかし今、私のプログラムはまったく動いていません。以下はスタックトレースです。 ImportError:dlopen(/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so、2 ):シンボルが見つかりません:__PyCodecInfo_GetIncrementalDecoder 参照元:/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so :フラットな名前空間 /usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so –

+1

ここには更新されたopensslバージョンbtwがあります: >>> print ssl.OPENSSL_VERSION OpenSSL 1.0.2h 3月2016 –

+0

@ Mr.Bing:おそらくあなたはopensslを更新しましたが、更新されたopensslバージョンを正しく使用するためにpythonを再コンパイルしませんでした。または、ちょうどあなたがコンパイルしたものではなく、誤ったバージョンのPythonを使用しています。それは伝えにくいですが、あなたが見ているエラーメッセージのヒットがたくさんあります。 –

関連する問題