可能与#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
请求工具带 0.2.0
urllib3 1.8
可悲的是,这与您发现的问题无关,完全取决于 OS X 默认附带的糟糕的 OpenSSL。 0.9.8y 版本在执行 SSL 握手方面存在一些实际问题,并且一些服务器不能很好地容忍它。 在我的 OS X 机器上使用 Python 3(因此使用更新的 OpenSSL)表明没有问题。
你有两个选择:
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 virtualbox 上。 为这个冗长的问题道歉!
无需道歉,问这个问题是正确的做法:知道 OS X 有这个问题是非常奇怪的具体知识。 =)
好吧,这是一个无赖。 我通过 Vagrant 创建了一个 Ubuntu 14.04 服务器 32 位 Virtualbox 映像,除了 SSLv2 情况外,这一切仍在发生,因为该协议未包含在 Ubuntu 14.04 的 OpenSSL 版本中(我相信按照设计,SSLv2 已经过时了)和过时)。
版本:
Ubuntu 14.04 32bit(通过 Vagrant/Virtualbox 组合)
Python 2.7.6
请求==2.2.1
请求工具带==0.2.0
urllib3==1.8.2
编辑:忘记了 OpenSSL 版本...
python -c "导入 ssl;打印 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 版本还有问题?
如有必要,我绝对愿意花一些时间来帮助调试...只要你们给我一些指导。
虚拟机正在下载。 我无法在 ArchLinux 上重现它。
堆栈跟踪表明了这一点,但我想确定:您_不_使用 PyOpenSSL,而只使用 stdlib?
@t-8ch 感谢您查看此内容,我有点困惑。 OpenSSL 让我的生活变得非常艰难 =(
@t-8ch 如果您要问的话,我还没有安装 PyOpenSSL?
我会假设(可能是错误的) pip install requests
应该为我提供在 HTTPS 页面上成功调用requests.get('...')
所需的一切。 当然,它在大多数情况下都有效,只是出于某种原因不适用于该站点。
@jaddison它_大部分_确实如此。 不幸的是,Python 2.7s 标准库很烂,不支持一些特性,比如 SNI。
我想知道这是不是SNI...
@jaddison 幕后有两种不同的代码路径。 您不必关心这些,但了解调试时会有所帮助。
但是我现在可以在 ubuntu 上重现它。 但只有 o Py2。 在 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.
编辑:啊,没关系 - 我认为这个错误不应该在 Py 2 和 3 之间变化。
@jaddison要测试这是否是 SNI,您需要安装 Python 2 的 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
详细说明:第二个命令启用openssl s_client
的 SNI 功能。
您可以 a) 切换到 python3 b) 安装额外的依赖项。
标准库目前无法进行 SNI。
感谢您的快速反馈。 鉴于没有错误,我将关闭此...再次。
嘿嘿,谢谢各位!! 我在我的 Mac 上安装了 python3 并且繁荣,它工作。
只是想插话说我在 OS X 10.9.5、Python 2.7.7 和 OpenSSL 0.9.8zc 上遇到了这个问题。
我能够通过以下方式解决我的握手问题:
brew install OpenSSL
在我的机器上安装更新的 OpenSSLenv 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,Python 2.7.6 通过 Homebrew 安装,但使用系统提供的 OpenSSL 0.9.8zg 编译),这是我为 Django 启动和运行requests
的整个过程:
brew install openssl
安装requests
和一堆SNI 东西,根据我们新安装的 OpenSSL 编译。 [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 上运行。 将我们的整个代码库升级到 python 3 不是一种选择。
好的,我可能刚刚回答了我自己的问题。 我所做的归结为:
sudo apt-get install libffi-dev
pip install pyOpenSSL ndg-httpsclient pyasn1
@lsemel谢谢,这为我节省了很多时间
@lsemel你确定吗? 我在 Ubuntu 15.10 上尝试过,但它仍然不适用于 Python 2.7.10。
它适用于 Travis CI 上的 Python 2.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,从而使我们能够更有效地保护它。
好的,我现在已经玩过这个了。
它适用于 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)
在安装了 Python 2.7.10 的 Ubuntu 15.10 和 Windows 10 上的行为相同。
那是因为没有 ndg-httpsclient 就不会使用 PyOpenSSL 支持。
是的,如果 SubjectAltName 被禁用,我将不得不深入研究它为什么会起作用。 任何的想法?
几乎可以肯定,问题在于您在每种情况下都使用不同的 OpenSSL。
我在我的 Ubuntu 14.04 机器和 Python 2.7.11 上遇到了同样的问题
来自 SNI
对我有用的是:
我认为对 urllib3 或请求进行了安装时检查,这会使事情在没有卸载的情况下无法工作
@jvanasco你用什么来安装这些包? 我假设点子。 为什么要分别安装 urllib3 和 requests?
好吧,我需要 virtualenv 中的 urllib3 ......但我安装它是为了尝试通过 pip 和 easy_install 安装要求。 (我两个都用过)
我有一个网络索引器,一些网址坏了。 我编写了一个快速脚本来尝试损坏的脚本,并继续重新安装/删除+安装 urllib3 中有关 ssl 问题的说明中的软件包,直到它们起作用为止。
2016 年 5 月 31 日晚上 7:25,Ian Cordasco [email protected]写道:
@jvanasco你用什么来安装这些包? 我假设点子。 为什么要分别安装 urllib3 和 requests?
—
你收到这个是因为你被提到了。
直接回复此邮件,在 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 设置。 有问题的服务器在公共互联网上可用吗? 如果是这样,你能给我提供网址吗?
我已经按照建议尝试了 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áz [email protected] 1.0.1e-48.1
修复 CVE-2016-2105 - base64 编码可能溢出
修复 CVE-2016-2106 - EVP_EncryptUpdate() 中可能的溢出
修复 CVE-2016-2107 - 在缝合的 AES-NI CBC-MAC 中填充 oracle
修复 CVE-2016-2108 - ASN.1 编码器中的内存损坏
修复 CVE-2016-2109 - 从 BIO 读取 ASN.1 数据时可能出现 DoS
修复 CVE-2016-0799 - BIO_printf 中的内存问题
2016 年 2 月 24 日星期三 Tomáš Mráz [email protected] 1.0.1e-48
修复 CVE-2016-0702 - 对模幂的侧信道攻击
修复 CVE-2016-0705 - DSA 私钥解析中的双重释放
修复 CVE-2016-0797 - BN_hex2bn 和 BN_dec2bn 中的堆损坏
2016 年 2 月 16 日星期二 Tomáš Mráz [email protected] 1.0.1e-47
修复 CVE-2015-3197 - SSLv2 密码套件实施
在通用 TLS 方法中禁用 SSLv2
2016 年 1 月 15 日星期五 Tomáš Mráz [email protected] 1.0.1e-46
修复 pkcs12 解析中的 1 字节内存泄漏 (#1229871)
记录 speed 命令的一些选项 (#1197095)
2016 年 1 月 14 日星期四 Tomáš Mráz [email protected] 1.0.1e-45
修复时间戳权威中的高精度时间戳
2015 年 12 月 21 日星期一 Tomáš Mráz [email protected] 1.0.1e-44
修复 CVE-2015-7575 - 不允许在 TLS1.2 中使用 MD5
2015 年 12 月 4 日星期五 Tomáš Mráz [email protected] 1.0.1e-43
修复 CVE-2015-3194 - 缺少 PSS 参数的证书验证崩溃
修复 CVE-2015-3195 - X509_ATTRIBUTE 内存泄漏
修复 CVE-2015-3196 - 处理 PSK 身份提示时的竞争条件
2015 年 6 月 23 日星期二 Tomáš Mráz [email protected] 1.0.1e-42
更新 :
所以我找到了解决这个问题的方法。
基本上,一位同事正在阅读这个问题,并看到一些关于 RHEL openssl 对 ECC/ECDH 密码的支持无论出于何种原因都不是 100% 的帖子。
我们通过显式禁用 ECDH 密码来尝试对 URL 的请求(添加来自 openssl 脚本本身的否定,即 openssl s_client -connect 10.85.103.218:8443 -cipher 'DEFAULT:!ECDH')
我们能够成功连接。
这是 ubuntu 14.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抱歉。 我打算提供更多信息,然后被跟踪(因为我没有时间这样做)。 我正在使用 Ubuntu 14.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 环境
源环境/bin/激活
pip 安装请求
pip 安装请求[安全]
回声“导入请求”>> test.py
echo 'requests.get("https://API_ID.execute-api.us-west-2.amazonaws.com/ENV/ENPOINT")' >> test.py
蟒蛇测试.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?
好的,这两个警告都表明您的请求实际上并未使用请求 [安全] 的扩展。 它强烈建议您执行的任何 Python _not_ 都不是您在虚拟环境中安装的: requests[security] 扩展应该删除这些警告。
@lukas-gitl 请看我上面的笔记。
您有权访问服务器吗? 比较服务器和客户端的默认密码列表。
很可能其中一个不支持另一个中的第一组密码,因此出现错误。
您可以使用我在这里使用的简单脚本检查默认密码:
导入系统
导入操作系统
导入 ssl
打印(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 环境执行时,这些怎么可能来自那里呢?
所以我尝试pip install pyopenssl ndg-httpsclient pyasn1
而不是pip install requests[security]
并且有效...
啊哈,我怀疑你的点子太老了,无法处理额外的东西。
啊,该死的。 这解释了很多。 非常感谢您的帮助!
我在这里遇到了同样的麻烦,我是通过以下代码发送一个 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 中,无法升级/删除pyopenssl
,因为它归操作系统所有。
Markstrefford 的解决方案在 mac os sierra 上也适用于我
@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}
安装我不是 100% 确定针对 openssl 安装实际上做了什么,因为它的行为似乎与没有安装相同(例如,速度和消息传递都看起来相同)
按照另一个线程(上面)的指示,直接通过 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] 操作系统:Linux-4.14.0-041400-generic-x86_64-with-Ubuntu-14.04-trusty
[cli][调试] Python:2.7.6
[cli][debug] 流链接:0.13.0+27.g2ff314c
[cli][debug] 请求(2.19.1),袜子(1.6.7),Websocket(0.48.0)
[cli][info] 为 URL h ttpstream://https : //www.arconaitv.us/stream.php ?id=43 找到匹配的插件 http
[plugin.http][debug] URL= https://www.arconaitv.us/stream.php?id=43; 参数={}
[cli][info] 可用流:直播(最差,最好)
[cli][info] 开场直播:直播 (http)
[cli][debug] 预缓冲 8192 字节
[cli][info] 起始播放器:/usr/bin/vlc
[cli][debug] 将流写入输出
[cli][info] 直播结束
[cli][info] 关闭当前打开的流..
试过但没有运气
atlast 让它在本地电脑上运行 tvplayer。 我在本地电脑上安装了 tinyproxy,但在 vps httpproxy xxxx 中无法正常工作。
tinyproxy 可以吗,或者我需要在我的本地电脑上安装一些其他代理服务器。
嗨@maanich ,这似乎与这个问题没有直接关系,或者是这个问题跟踪器保留的请求的缺陷报告。 如果您对系统配置有疑问,最好在StackOverflow等平台上解决这些问题。 谢谢!
streamlink --https-proxy " http://8xxxx :8000/" --tvplayer-email [email protected] --tvplayer-password vcvdf3 --http-no-ssl-verify https://tvplayer.com/watch /itv最佳 --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-static https://johnvansickle.com/ffmpeg/版权所有 (c) 2000-2018 FFmpeg 开发者
使用 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
libav 设备 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
[console][info] streamlink 正在以 root 身份运行! 当心!
[console][info] 找到 URL https://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-Pair-Id=APKAJGWDVCU5SXAPJELQ(403客户端错误:
pipe:0 : 处理输入时发现无效数据
请建议n什么代理服务器对streamlink有好处(如果有的话)
最有用的评论
可悲的是,这与您发现的问题无关,完全取决于 OS X 默认附带的糟糕的 OpenSSL。 0.9.8y 版本在执行 SSL 握手方面存在一些实际问题,并且一些服务器不能很好地容忍它。 在我的 OS X 机器上使用 Python 3(因此使用更新的 OpenSSL)表明没有问题。
你有两个选择:
env ARCHFLAGS="-arch x86_64" LDFLAGS="-L/usr/local/opt/openssl/lib" CFLAGS="-I/usr/local/opt/openssl/include" pip install PyOpenSSL
来针对该新版本安装 PyOpenSSL。