おそらく#1083に関連しています。 この特定のサイト/ページhttps://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html
の標準requests.get()
は、次のようになります。
>>> import requests
>>> requests.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
request-toolbelt
のSSLAdapter
を使用してさまざまなSSLバージョンを試してみると、すべて失敗しているように見えます...次のトレースバックを参照してください。
TLSv1:
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv3:
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
最後のものは他とは異なるConnection reset by peer
エラーを与えることに注意してください、しかし私はSSLv2がとにかくサーバーによってサポートされていないことをかなり確信しています。
楽しみのために、私は最後のリクエストでもいくつかのより適切なヘッダーを通過させようとしました:
>>> headers = {
... 'Accept': u"text/html,application/xhtml+xml,application/xml",
... 'User-Agent': u"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36",
... 'Accept-Encoding': u"gzip,deflate",
... 'Accept-Language': u"en-US,en;q=0.8"
... }
>>> adapter = SSLAdapter('SSLv2')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html', headers=headers)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Users/jaddison/.virtualenvs/techtown/lib/python2.7/site-packages/requests/adapters.py", line 378, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='docs.apitools.com', port=443): Max retries exceeded with url: /2014/04/24/a-small-router-for-openresty.html (Caused by <class 'socket.error'>: [Errno 54] Connection reset by peer)
そこにもサイコロはありません。 Mac上のChromeのHTTPS接続情報は次のようになります。
私は前向きではありませんが、いくつかのグーグルは、それが暗号リストの問題である可能性が高いことを示しています。これは、よりurllib3だと思いますか?
pyopenssl
のDEFAULT_CIPHER_LIST
を変更しようとしましたが、インポートエラーが発生し始めました。 この時点では、物事が壊れたように見えましたが、これを修正するための適切な方法はまだありませんでした。
バージョン情報:
OSXマーベリックス
Python 2.7.5
OpenSSL 0.9.8y 2013年2月5日-( python -c "import ssl; print ssl.OPENSSL_VERSION"
から)
リクエスト2.2.1
リクエスト-toolbelt0.2.0
urllib3 1.8
残念ながら、これはあなたが特定した問題とは無関係であり、OSXにデフォルトで付属している安っぽいOpenSSLに完全に依存しています。 バージョン0.9.8yには、SSLハンドシェイクの実行に関していくつかの実際の問題があり、一部のサーバーはそれを十分に許容しません。 OSXボックスでPython3を使用すると(したがって、新しいOpenSSLを使用すると)、問題がないことがわかります。
2つのオプションがあります。
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
を実行して、その新しいバージョンに対してPyOpenSSLをインストールします。ああ、私はその時赤いニシンを追いかけていたようです-とにかくOSXに何かを展開するつもりはありません。 テストをLinux仮想ボックスに移動するようです。 この長い間問題が発生したことをお詫びします。
謝罪する必要はありません。その質問をするのは正しいことでした。OSXにこの問題があることを知るのは、奇妙なことに特定の知識です。 =)
わかりました、これは残念です。 Vagrantを介してUbuntu14.04サーバーの32ビットVirtualboxイメージを作成しましたが、プロトコルがUbuntu 14.04のOpenSSLバージョンに含まれていないために失敗するSSLv2の場合を除いて、これはすべてまだ発生しています(設計上、SSLv2は古いと思います)と時代遅れ)。
バージョン:
Ubuntu 14.04 32ビット(Vagrant / Virtualboxコンボ経由)
Python 2.7.6
リクエスト== 2.2.1
リクエスト-toolbelt == 0.2.0
urllib3 == 1.8.2
編集:OpenSSLバージョンを忘れました...
python -c "import ssl; print ssl.OPENSSL_VERSION"
OpenSSL 1.0.1f 2014年1月6日
TLSv1:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('TLSv1')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv2:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv3')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
SSLv23:
>>> import requests
>>> from requests_toolbelt import SSLAdapter
>>> adapter = SSLAdapter('SSLv23')
>>> s = requests.Session()
>>> s.mount('https://', adapter)
>>> s.get('https://docs.apitools.com/2014/04/24/a-small-router-for-openresty.html')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 395, in get
return self.request('GET', url, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/home/vagrant/.virtualenvs/techtown/local/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
おそらくこれは暗号リストの問題ですか? または、ここで使用されているOpenSSLバージョンはまだ問題がありますか?
必要に応じて、これをデバッグするのを手伝うために、私は絶対に時間を割いて喜んでいます...皆さんが私にいくつかの指示を与えてくれれば。
VMがダウンロード中です。 ArchLinuxではこれを再現できません。
スタックトレースはこれを示していますが、確認したいのですが、PyOpenSSLを使用していませんが、stdlibのみを使用していますか?
@ t-8chこれを見てくれてありがとう、私は少し混乱しています。 OpenSSLは私の人生を本当に難しくします=(
@ t-8chそれがあなたが求めているものなら、私はPyOpenSSLをインストールしていませんか?
pip install requests
は、HTTPSページでrequests.get('...')
を正常に呼び出すために必要なすべてのものを提供するはずだと(おそらく間違って)想定していました。 もちろん、これはほとんどの部分で機能しますが、何らかの理由でこのサイトでは機能しません。
@jaddisonそれは_ほとんど_します。 残念ながら、Python 2.7sの標準ライブラリは非常に使い勝手が悪く、SNIなどの一部の機能をサポートしていません。
これはSNIなのかしら...
@jaddison舞台裏には2つの異なるコードパスがあります。 これらについて気にする必要はありませんが、デバッグするときに知っておくと役立ちます。
しかし、これをubuntuで再現できるようになりました。 しかし、oPy2のみ。 Py3ではすべてが正常です。
@Lukasaが正しく、クライアントがSNIを使用していないときにサーバーに障害が発生したと思われます。
問題のサーバーに応じて、SNIの不在が複数の異なる方法で失敗するのは気になります。
OpenSSL 1.0.1fと1.0.1g(https://www.openssl.org/news/openssl-1.0.1-notes.html)の間でこの変更に気づきました。
Add TLS padding extension workaround for broken servers.
編集:ああ、気にしないでください-バグはPy2と3の間で変化するべきではないと思います。
@jaddisonこれがSNIであるかどうかをテストするには、Python2のSNI要件をインストールする必要があります。
@Lukasaは正しかった。 比較:
$ openssl s_client -connect docs.apitools.com:443
CONNECTED(00000003)
139846853338768:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:762:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 517 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$ openssl s_client -connect docs.apitools.com:443 -servername docs.apitools.com
... happy handshake here
詳細:2番目のコマンドは、 openssl s_client
のSNI機能を有効にします。
a)python3に切り替えるb)追加の依存関係をインストールすることができます。
stdlibには、現時点ではSNIを実行する方法がありません。
迅速なフィードバックをありがとう。 バグがないので、これを閉じます...もう一度。
ねえ、みんなありがとう! Macとブームにpython3をインストールしましたが、動作します。
チャイムを鳴らして、OS X 10.9.5、Python 2.7.7、OpenSSL0.9.8zcでこの問題が発生したことを伝えたいと思います。
ハンドシェイクの問題は次の方法で修正できました。
brew install OpenSSL
を介して私のマシンに在庫よりも新しいOpenSSLをインストールするenv ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install cryptography
)に対してリンクされたcryptography
パッケージのコンパイルとインストールpip install requests[security]
を実行してSNIサポート付きのリクエストをインストールするありがとう、@ Microserf。 私はほぼ同じ仕様を実行しています(10.9.5、Homebrew経由でインストールされたPython 2.7.6ですが、OpenSSL 0.9.8zgを提供するシステムでコンパイルされています)。これは、Djangoでrequests
を起動して実行するためのプロセス全体でした。 :
brew install openssl
OpenSSLの新しいインストールに対してコンパイルされたSNIのものの束でrequests
をインストールします。 [security]
オプションは、単にpyopenssl ndg-httpsclient pyasn1
をインストールします
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install requests[security] urllib3
そして、私たちは行ってもいいです:
"""
This may or may not be needed. See:
https://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl
"""
# from urllib3.contrib import pyopenssl
# pyopenssl.inject_into_urllib3()
import requests
# r = requests.get(...)
これをubuntuで機能させる方法についての決定的な答えはありますか? 私はこの問題に遭遇しています、そしてここでの唯一の答えはこれをMacで動作させる方法に関するもののようです。 コードベース全体をPython3にアップグレードすることはできません。
OK、私は自分の質問に答えたばかりかもしれません。 私がしたことは要約すると:
sudo apt-get install libffi-dev
pip install pyOpenSSL ndg-httpsclient pyasn1
@lsemelありがとう、それは私にたくさんの時間を節約しました
@lsemelよろしいですか? Ubuntu 15.10で試しましたが、Python2.7.10ではまだ機能しません。
TravisCIのPython2.7で動作します。
https://travis-ci.org/playing-se/swish-python
今すぐ動作します! pyOpenSSLをアンインストールしただけです。
pip uninstall pyOpenSSL
Pythonのバージョンが2.7.9未満の場合は、pyopenssl.inject_into_urllib3()のみを使用する必要がありますか? Pythonのバージョンが2.7.10の場合、pyOpenSSLはUbuntuとWindowsで問題を解決するようです。
PyOpenSSLは何も壊してはいけません。 もしそうなら、それは報告されるべきバグです。
これを調べる必要がありますが、Pythonのバージョンが2.7.9以降の場合、pyopensslをurllib3に挿入する正当な理由はありますか?
私はこのようなことを考えています:
# Check if Modern SSL with SNI support
try:
from ssl import SSLContext
from ssl import HAS_SNI
except ImportError:
# Attempt to enable urllib3's SNI support, if possible
try:
from .packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3()
except ImportError:
pass
ええ、頻繁にあります。 たとえば、OS Xでは、ほとんどのPythonがシステムOpenSSL(バージョン0.9.8zg)に対してリンクしています。 ただし、PyOpenSSLは、はるかに新しいOpenSSL(1.0.2)に対してリンクします。 これにより、PyOpenSSLの使用によりセキュリティが大幅に向上します。
さらに、PyOpenSSLを使用すると、OpenSSLへのアクセスが大幅に向上し、より効果的にセキュリティを確保できます。
OK、これで少し遊んだことがあります。
pyopensslで動作しますが、ndg-httpsclientがインストールされている場合は動作しません。
ただし、pyasn1をアンインストールすると、次の警告が表示され、ndg-httpsclientで動作させることができます。
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/ssl_peer_verification.py:25: UserWarning: SubjectAltName support is disabled - check pyasn1 package installation to enable
warnings.warn(SUBJ_ALT_NAME_SUPPORT_MSG)
/usr/lib/python2.7/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named pyasn1.type
warnings.warn(import_error_msg)
Python2.7.10がインストールされているUbuntu15.10およびWindows10でも同じ動作。
これは、ndg-httpsclientがないと、PyOpenSSLサポートが使用されないためです。
はい、SubjectAltNameが無効になっている場合になぜ機能するのかを掘り下げる必要があります。 何か案が?
ほぼ確実に問題は、それぞれの場合に異なるOpenSSLを使用していることです。
Ubuntu14.04ボックスとPython2.7.11で同じ問題が発生しました
SNIからです
私のために働いたのはこれでした:
urllib3のインストール時のチェックや、アンインストールせずに動作しないようにするリクエストがあったと思います
@jvanascoこれらのパッケージをインストールするために何を使用していますか? 私はピップを想定しています。 なぜurllib3とリクエストを別々にインストールするのですか?
virtualenvにurllib3が必要でしたが、pipとeasy_installで要件をインストールするためにインストールしました。 (私は両方を使用しました)
Webインデクサーがあり、いくつかのURLが壊れています。 私は壊れたものを試すための簡単なスクリプトを書き、それらが機能するまでsslの問題に関するurllib3の指示でパッケージを再インストール/削除+インストールし続けました。
2016年5月31日午後7時25分、 IanCordasconotifications @ github.comは次のように書いています。
@jvanascoこれらのパッケージをインストールするために何を使用していますか? 私はピップを想定しています。 なぜurllib3とリクエストを別々にインストールするのですか?
—
あなたが言及されたので、あなたはこれを受け取っています。
このメールに直接返信するか、GitHubで表示するか、スレッドをミュートしてください。
この問題はまだ発生しており、提案された回避策を試しました。
Pythonのバージョンを2.7.11に更新しました
3つの追加パッケージをインストールしました。
@jvanascoが提案したアンインストール/インストールシーケンスを試しましたが、SSLErrorが発生しました
また、Ubuntu 14.04を使用すると、残念ながらOpenSSLの更新がないため、ここに記載されている回避策を使用する必要があり、運がありません。
皆さんが取った可能性のある追加の手順はありますか?
ありがとう
@Lekinho問題が発生したドメインをテストする短いテストスクリプトを作成すると、問題が発生することがわかりました。
それだけでした:
import requests
r = requests.get(bad_url)
print r.__dict__
@Lekinhoコード内のリクエストからpyopensslを抽出できます。
try:
from requests.packages.urllib3.contrib import pyopenssl
pyopenssl.extract_from_urllib3()
except ImportError:
pass
@Lekinho Python 2.7.11でこの問題が引き続き発生する場合は、リモートサーバーがリクエストで使用されているTLS設定をサポートしていない可能性があります。 問題のサーバーはパブリックインターネットで利用できますか? もしそうなら、URLを教えていただけますか?
提案されているように、pyopensslのインポートを試しました。
残念ながら、これは公にアクセスできません。
ただし、サーバーのopenSSLバージョンの正確な詳細はわかっています。
基本的に、RedHat仮想マシンで実行します。すべてが機能しているときにこのopenSSLを使用しました:openssl-1.0.1e-42.el6_7.4.x86_64
次に、redhatのアップグレードを行い、opensslの更新がありました:openssl-1.0.1e-48.el6_8.1.x86_64
このバージョンでは、ubuntu 14.04でopensslを使用すると、常にハンドシェイクの問題が発生します。
回避策が問題の解決に役立ったかどうか、そして私が持っているこのユニークな組み合わせが問題であるかどうかを確認するために、私が試すことができる公開URLを持っていますか?
RESTリクエストがブラウザを介して送信される場合(つまり、ubuntu opensslがない場合)、同じマシンで問題ありません。
ありがとう
rpm -q --changelog openssl
の出力を提供していただけますか?
[ admin @ leke-2-2-8-11〜 ] $ rpm -q --changelog openssl
@Lekinhoがgithubアカウントを削除したようです。 問題を抱えている次の人のために-OpenSslまたはPythonのアップグレードがいくつかのコンパイルされたcバインディングを壊した可能性があります。 そのようなアップグレードがあるときはいつでも、virtualenvまたはすべてのパッケージを破棄してから、新しいパッケージをビルドします。
@jvanasco私はまだここにいます。
疑問に思っていたのですが、これをテストできる公開URLはありますか? 回避策が確認されたケースの問題を実際に解決するかどうかを確認したい(これは、それを実行しようとしているときに何かを台無しにしなかったことを意味します)
@ルカサ
作業バージョンと更新バージョンの間のチェンジセットのサブセット:+1:
2016年5月2日月曜日TomášMrá[email protected]
CVE-2016-2105を修正-base64エンコーディングでオーバーフローが発生する可能性がある
CVE-2016-2106を修正-EVP_EncryptUpdate()でオーバーフローが発生する可能性
CVE-2016-2107を修正-ステッチされたAES-NICBC-MACでオラクルをパディング
CVE-2016-2108を修正-ASN.1エンコーダーのメモリ破損
CVE-2016-2109を修正-BIOからASN.1データを読み取るときに発生する可能性のあるDoS
CVE-2016-0799を修正-BIO_printfのメモリの問題
2016年2月24日水曜日TomášMrá[email protected]
CVE-2016-0702を修正-べき乗剰余に対するサイドチャネル攻撃
CVE-2016-0705を修正-DSA秘密鍵の解析でダブルフリー
CVE-2016-0797を修正-BN_hex2bnおよびBN_dec2bnのヒープ破損
2016年2月16日火曜日TomášMrá[email protected]
CVE-2015-3197を修正-SSLv2暗号スイートの施行
一般的なTLSメソッドでSSLv2を無効にする
2016年1月15日金曜日TomášMrá[email protected]
pkcs12 parseでの1バイトのメモリリークを修正しました(#1229871)
速度コマンドのいくつかのオプションを文書化する(#1197095)
2016年1月14日木曜日TomášMrá[email protected]
タイムスタンプ権限の高精度タイムスタンプを修正
2015年12月21日月曜日TomášMrá[email protected]
CVE-2015-7575を修正-TLS1.2でのMD5の使用を禁止
2015年12月4日金曜日TomášMrá[email protected]
CVE-2015-3194を修正-PSSパラメーターが欠落している証明書検証のクラッシュ
CVE-2015-3195を修正-X509_ATTRIBUTEメモリリーク
CVE-2015-3196を修正-PSKIDヒントを処理する際の競合状態
2015年6月23日火曜日TomášMrá[email protected]
アップデート :
だから私はこれの回避策を見つけました。
基本的に、同僚がこの問題について読んでいて、何らかの理由でECC / ECCH暗号のRHELopensslサポートが100%ではないことに関するいくつかの投稿を見ました。
ECDH暗号を明示的に無効にすることでURLへのリクエストを試しました(opensslスクリプト自体からの否定を追加します。つまりopenssl s_client -connect 10.85.103.218:8443 -cipher'DEFAULT:!ECDH ')
正常に接続できました。
これがubuntu14.04のopensslのデフォルトの暗号リストです
ECDH + AESGCM:DH + AESGCM :ECDH + AES256:DH + AES256:ECDH + AES128:DH + AES:ECDH + HIGH :DH + HIGH:ECDH + 3DES :DH + 3 DES:RSA + AESGCM :RSA + AES:RSA + HIGH :RSA + 3DES:!aNULL:!eNULL:!MD5
そこで、その知識を活かして、pyopensslを使用してデフォルトのSSL暗号を出力し、文字列からすべてのECDH暗号を明示的に削除しました。 リクエストパッケージからurllib3をインポートするために(つまり、実際のリクエストを開始する前に)ブロック内でこれを実行しました。これは次のようなものです。
https://github.com/kennethreitz/requests/issues/1308
このアクションにはセキュリティ上のリスクがある可能性があることを認識していますが、少なくともこれにより、私たちは前進し、より多くの光を当てることができます。
なぜこれらの特定の暗号がRHELの問題であるように見えるのか、私にはわかりません。
時間があれば、特定のRHELの変更によってこれが導入された可能性があるかどうかを確認し、目的について詳しく読んでみます。
一般的に暗号についてもっと知っている人はいますか?
同じ問題があります... ARG..。
@ lukas-gitlの欲求不満は問題の解決に役立ちません。 お客様の環境に関する情報(できれば、上記のLekinhoに尋ねた情報の一部(すべてではないにしても))を提供しておくと役立ちます。
@ sigmavirus24お詫びします。 私はより多くの情報を提供するつもりでしたが、その後、追跡されました(これを行う時間がなかったため)。 私はUbuntu14.04、python 2.7.6、およびpipの最新のリクエストバージョンを使用しています。 これは、API Gatewayエンドポイントとしてアクセスしようとすると発生します(かなり制限されている可能性があります)。
virtualenvを削除して再生成しようとしましたが、残念ながらそれは解決しませんでした。
他に何が必要か教えてください。 しばらくの間nodejsに切り替えましたが、解決のお手伝いをさせていただきます。
@ lukas-gitl接続しているサーバーには、提供していない暗号、または提供していないTLSバージョンが必要である可能性が高いです。 これは、インストールしたOpenSSLに関連している可能性があります。 pip install requests[security]
も実行してみてください。SNIで問題が発生している可能性があります。
ええ、私もすでにそれを試しました。 同じページにいるように、ここに簡単なテストスクリプトをまとめましょう。
virtualenv -p /usr/bin/python2.7 env
ソースenv / bin / activate
pipインストールリクエスト
pipインストールリクエスト[セキュリティ]
echo 'インポートリクエスト' >> test.py
echo'requests.get( "https://API_ID.execute-api.us-west-2.amazonaws.com/ENV/ENPOINT") '>> test.py
python test.py
そして、どのような特定のエラーが発生していますか?
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:318:
SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
SNIMissingWarning
.../env/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Traceback (most recent call last):
File "test.py", line 2, in <module>
requests.get("https://sbsz8eqowe.execute-api.us-west-2.amazonaws.com/dev/segment_to_s3_webhook")
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File ".../env/local/lib/python2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure```
だから私は基本的にPythonの新しいバージョンに更新する必要がありますか?
わかりました。これらの警告は両方とも、リクエストが実際にrequests [security]の拡張機能を使用していないことを示しています。 実行しているPythonが、仮想環境にインストールしたPythonではないことを強くお勧めします。requests[security]拡張機能はこれらの警告を削除する必要があります。
@ lukas-gitl上記の私のメモをご覧ください。
サーバーにアクセスできますか? サーバーとクライアントのデフォルトの暗号リストを比較します。
それらの1つが他の暗号の最初のセットをサポートしていない可能性が高いため、エラーが発生します。
ここで使用したような簡単なスクリプトを使用して、デフォルトの暗号を確認できます。
sysをインポート
OSのインポート
sslをインポートする
print(ssl.OPENSSL_VERSION)
sys.path.insert(1、os.path.abspath(os.path.join(os.getcwd()、 'lib')))
sys.path.append( '/ usr / local / lib / python2.7 / dist-packages')
インポートリクエスト
requests.packages.urllib3.contribからインポートpyopenssl
pyopenssl.inject_into_urllib3()
pyopenssl.DEFAULT_SSL_CIPHER_LISTを出力します
さて、今私は本当に混乱しています。 エラーメッセージは仮想環境から送信されます。 では、別のPython環境から実行しているときに、それらはどのようにしてそこから発生するのでしょうか。
だから私は$#$ 1 $#$の代わりにpip install requests[security]
pip install pyopenssl ndg-httpsclient pyasn1
を試しましたが、それはうまくいきました...
ああ、あなたのピップは古すぎて余分なものを処理できないと思います。
ああ、くそー。 それは多くのことを説明しています。 手伝ってくれてありがとうございます!
ここでも同じ問題が発生しました。次のコードでGETリクエストを送信しました。
requests.get('https://mdskip.taobao.com/core/initItemDetail.htm?itemId=530444505608&showShopProm=false&queryMemberRight=true&isRegionLevel=false&tmallBuySupport=true&addressLevel=2&sellerPreview=false&isForbidBuyItem=false&cachedTimestamp=1466835924196&offlineShop=false&household=false&tryBeforeBuy=false&isSecKill=false&service3C=false&isApparel=true&isUseInventoryCenter=false&cartEnable=true&isAreaSell=false&callback=setMdskip×tamp=1466841669969&isg=Al9faN3XWRpIf6UEoQ88UH/1b7np0rNm&ref=https%3A%2F%2Fs.taobao.com%2Fsearch%3Fq%3D%25E6%258B%2589%25E5%25A4%258F%25E8%25B4%259D%25E5%25B0%2594%26imgfile%3D%26commend%3Dall%26ssid%3Ds5-e%26search_type%3Ditem%26sourceId%3Dtb.index%26spm%3Da21bo.50862.201856-taobao-item.1%26ie%3Dutf8%26initiative_id%3Dtbindexz_20160625')
残念ながら、エラー情報が表示されました。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
brew install openssl、brew upgrade openssl、pip install --upgrade pip、pip install requests、pip install request [security]を試しましたが、機能しませんでした。
ただし、 openssl version
と入力すると、 OpenSSL 0.9.8zh 14 Jan 2016
が表示されますが、問題ないかどうかはわかりません。
それを手伝ってくれる人はいますか?
@ jschwinger23 pip install pyopenssl ndg-httpsclient pyasn1
も実行できますか?
@Lukasaお返事ありがとうございます。 私はそれらをインストールしたことを再確認しました:
$ pip install pyopenssl ndg-httpsclient pyasn1
Requirement already satisfied (use --upgrade to upgrade): pyopenssl in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Requirement already satisfied (use --upgrade to upgrade): ndg-httpsclient in /Library/Python/2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pyasn1 in /Library/Python/2.7/site-packages
しかし、コードはまだダウンしています。
とにかく、私はすべてがPython3でうまくいくことを理解しました、そして私はpython3でコーディングできることをうれしく思います。
どうもありがとうございました。
上記の手順に従いましたが、まだこの問題が発生しています
`` `
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/requests/api.py", line 71, in get
return request('get', url, params=params, **kwargs)
File "/Library/Python/2.7/site-packages/requests/api.py", line 57, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 475, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests/sessions.py", line 585, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 477, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')],)",)
何か案は?
`` `` ``
@rohanpai暗号の重複がないか、リモートサーバーが提供しているバージョンに不満を持っているか、クライアント証明書を提供することが期待されているがそうではない可能性があります。 より具体的なアドバイスをするのは難しいです。 これを試して問題を調査してください。
ubuntu 14.04LTSでは、これを行う必要がありました。
sudo pip install ndg-httpsclient pyasn1 --upgrade
Ubuntuでは、OSが所有しているため、 pyopenssl
をアップグレード/削除することはできません。
marktreffordのソリューションは、mac ossierraでも機能しました
@markstreffordのソリューションも私のために働いた。
OpenSSL 1.1を使用している人は、次のことを確認してください。
リモートサーバーが最初のオプションとして楕円曲線を提供している場合、TLSアダプターを強制する場合でも、この問題が発生します。
原因は次のとおりです:http: //bugs.python.org/issue29697
やあみんな! 次のサーバーhttps://34.200.105.231/SID/Service.svc?wsdl
でも同じ問題が発生しています。 私はすべてを試しましたが、同じ2つのエラーからジャンプします。
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:661)
何か案は? @Lukasa 、証明書にいくつかの問題がありますが、それほど悪くはないようです: https ://sslanalyzer.comodoca.com/?url = 34.200.105.231
証明書は通常、この問題を引き起こしません。この問題は、サーバーがハングアップしていることが原因であるため、通常、暗号スイートの不一致が原因です。 この場合、ここで見ることができるように、まさにそれが起こっていることです。
これは、率直に言って、オープンインターネットに決してさらされるべきではないサーバーです。 このサーバーと通信するための安全な方法はありません:なし、ゼロ。 これがハンドシェイクが失敗する理由です。リクエストは最新の暗号スイートのみを受け入れ、このサーバーで使用できる最新の暗号スイートはありません。 最適なオプションはTLS_RSA_WITH_3DES_EDE_CBC_SHA
です。これは、大規模なデータ転送に対する実際の攻撃に対して脆弱であるため、削除したオプションです。
このサーバーを使用している場合は、より適切なTLS実装にアップグレードするか、設定を変更してください。 それ以外の場合、私の最初のアドバイスは、このサーバーとの会話を再考することです。 必要に応じて、ここのコードを使用できますが、この混乱を修正するようにサーバーオペレーターに圧力をかけることを強くお勧めします。
@ Lukasa-みんなでこれをやり遂げてくれてありがとう! 私はこれを読み通して試しました
Windowsでスクリプトを実行すると、すべて機能します。
OSXでスクリプトを実行する場合、以下を受け取ります。
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
私はそれがサーバー自体ではないと確信していませんが、このウサギの穴から私を確認および/またはポップするための追加の助けをいただければ幸いです。 それを機能させるには大きな勝利になるでしょう。
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install --force-reinstall --no-cache-dir {PACKAGE}
に対してインストールされますopensslに対してインストールすると、実際に何かが行われたかどうかは100%わかりません。これは、なしでインストールした場合と同じように機能するように見えたためです(たとえば、速度とメッセージングはすべて同じように見えました)。
別のスレッド(上記)で指示されているように、openSSL appears
を介して直接接続して満足していますか?
openssl s_client -connect XXX.102.7.147:443
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 198 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1493384325
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
---
ええと... OpenSSLは技術的には問題ありませんが、OpenSSLは暗号をネゴシエートしませんでした(つまり、 SSL_NULL_WITH_NULL_NULL
をネゴシエートしたようです。サーバーに対してssllabsを実行し、サポートされている暗号スイートを確認できますか?
@Lukasaインターネット上で公開されていませんが、適切な洞察を提供できるコマンドラインプローブを起動できますか?
あなたはcipherscanを試すことができます。
@Lukasaはそれをインストールしました...その演技は不安定です(出力なし、それを見て)...私が渡すことができる何かを思いついた場合は投稿します。 指導ありがとうございます!
@Lukasaはあなたの助けに感謝します-実際にcipherscanが機能することはありませんでした-しかし私たちの問題を修正しました。 それはこれとは何の関係もなく、私たちの環境全体でのばかげたIPの不一致でした...教訓を学びました! ありがとうございます ...
まったく問題ありません。並べ替えてよかったです。
streamlink -l debug h ttpstream:// https :// www.arconaitv.us/stream.php?id=43最悪
[cli] [info] streamlinkがrootとして実行されています! 気をつけて!
[cli] [debug] OS:Linux-4.14.0-041400-generic-x86_64-with-Ubuntu-14.04-trusty
[cli] [debug] Python:2.7.6
[cli] [デバッグ]ストリームリンク:0.13.0 + 27.g2ff314c
[cli] [debug]リクエスト(2.19.1)、ソックス(1.6.7)、ウェブソケット(0.48.0)
[cli] [info] URLに一致するプラグインhttpが見つかりましたhttpstream:// https :// www.arconaitv.us/stream.php?id=43
[plugin.http] [debug] URL = https://www.arconaitv.us/stream.php?id=43; params = {}
[cli] [info]利用可能なストリーム:ライブ(最悪、最高)
[cli] [info]オープニングストリーム:ライブ(http)
[cli] [debug] 8192バイトのプリバッファリング
[cli] [info]開始プレーヤー:/ usr / bin / vlc
[cli] [debug]出力へのストリームの書き込み
[cli] [info]ストリームが終了しました
[cli] [info]現在開いているストリームを閉じます。
試したが運がなかった
ついにローカルPCでtvplayerが動作するようになりました。 ローカルPCにtinyproxyをインストールしましたが、vps httpproxyxxxxが機能していません。
tinyproxyは大丈夫です、またはローカルPCにインストールするために他のプロキシサーバーが必要です。
こんにちは@maanich 、これはこの問題に直接関連していないようです。また、この問題追跡システムが予約されているリクエストの欠陥レポートではないようです。 システム構成について質問がある場合は、 StackOverflowなどのプラットフォームで対処するのが最適です。 ありがとう!
streamlink --https-proxy " http:// 8xxxx :8000 /" --tvplayer-email [email protected] --tvplayer-password vcvdf3 --http-no-ssl-verify https://tvplayer.com/watch / itv best --player-no-close --stdout | / var / tmp / youtube / ffmpeg -y -i pipe:0 -vcodec copy -acodec copy -flags -global_header -hls_flags delete_segments -hls_time 10 -hls_list_size 6 /mnt/hls/arc.m3u8
ffmpegバージョン4.0-静的https://johnvansickle.com/ffmpeg/Copyright(c)2000-2018FFmpeg開発者
gcc 6.3.0(Debian 6.3.0-18 + deb9u1)で構築20170516
設定:-enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev = sndio --disable-outdev = sndio --cc = gcc-6- enable-libxml2 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libfreetype --enable-libmp3lame- enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libvorbis --enable-libopus --enable-libtheora --enable -libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg
libavutil 56. 14.100 / 56. 14.100
libavcodec 58. 18.100 / 58. 18.100
libavformat 58. 12.100 / 58. 12.100
libavdevice 58. 3.100 / 58. 3.100
libavfilter 7. 16.100 / 7. 16.100
libswscale 5. 1.100 / 5. 1.100
libswresample 3. 1.100 / 3. 1.100
libpostproc 55. 1.100 / 55. 1.100
[コンソール] [情報] streamlinkがrootとして実行されています! 気をつけて!
[コンソール] [情報] URLhttps://tvplayer.com/watch/itvに一致するプラグインtvplayerが見つかりました
エラー:オープンURLにできません: https://live.tvplayer.com/stream.m3u8?id=204&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cCo6XC9cL2xpdmUudHZwbGF5ZXIuY29tXC9zdHJlYW0ubTN1OD9pZD0yMDQiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE1MjkwNTc0OTR9LCJJcEFkZHJlc3MiOnsiQVdTOlNvdXJjZUlwIjoiNjIuMjEwLjE0Mi42NlwvMzIifX19XX0_&Signature=mHOteYcUu4QsbGD n0e〜7meDUGT8VN7bVOBAHa-0Mk6ROA9XHYx3aIAZMAo3dFjOGuWk-3MszJzRFHdv〜-CCsmX3D8XQa2zvzfuIWfMAT〜yDshroXBN25iW6ZJ0-7lGla00jMTUpm5sW-uDy18OkiBWgGvDVas2Lz-EW〜5-LTw2YWvEpqkvRB9OpcsHJj9RRQLuDVjwYKXwKvHTJmB1J 〜sGE3aigaL7AZyBaIAUMcpk-xYMpDuPV9BsBN9AT397lFfRPFt155u〜yeBHZ4JlUN2GINUBt0-CzGuYVq3dsO kYYEZJo9cQTVhArpo7ek03VbDP5egtCM8obN63AEkA __&Key-
pipe:0 :入力の処理中に無効なデータが見つかりました
アドバイスは、もしあれば、どのプロキシサーバーがstreamlinkに適しているかを教えてください
最も参考になるコメント
残念ながら、これはあなたが特定した問題とは無関係であり、OSXにデフォルトで付属している安っぽいOpenSSLに完全に依存しています。 バージョン0.9.8yには、SSLハンドシェイクの実行に関していくつかの実際の問題があり、一部のサーバーはそれを十分に許容しません。 OSXボックスでPython3を使用すると(したがって、新しいOpenSSLを使用すると)、問題がないことがわかります。
2つのオプションがあります。
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
を実行して、その新しいバージョンに対してPyOpenSSLをインストールします。