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は私のサーバーでは廃止されているので、このコードはまだ動作しますか?
あなたが言及したリンクを使用して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 –
ここには更新されたopensslバージョンbtwがあります: >>> print ssl.OPENSSL_VERSION OpenSSL 1.0.2h 3月2016 –
@ Mr.Bing:おそらくあなたはopensslを更新しましたが、更新されたopensslバージョンを正しく使用するためにpythonを再コンパイルしませんでした。または、ちょうどあなたがコンパイルしたものではなく、誤ったバージョンのPythonを使用しています。それは伝えにくいですが、あなたが見ているエラーメッセージのヒットがたくさんあります。 –