我在使用 python 2.7.9-2 amd64 的 Debian 8 系统上遇到问题:
marius@pydev:/usr/lib/python2.7/dist-packages/urllib3/contrib$ pip search doo
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 356, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2476, in load_entry_point
return ep.load()
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2190, in load
['__name__'])
File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 74, in <module>
from pip.vcs import git, mercurial, subversion, bazaar # noqa
File "/usr/lib/python2.7/dist-packages/pip/vcs/mercurial.py", line 9, in <module>
from pip.download import path_to_url
File "/usr/lib/python2.7/dist-packages/pip/download.py", line 22, in <module>
import requests, six
File "/usr/local/lib/python2.7/dist-packages/requests/__init__.py", line 53, in <module>
from .packages.urllib3.contrib import pyopenssl
File "/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 73, in <module>
ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD,
**AttributeError: 'module' object has no attribute 'PROTOCOL_SSLv3'**
我检查了库并尝试修补/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/contrib/pyopenssl.py
from .. import connection
from .. import util
__all__ = ['inject_into_urllib3', 'extract_from_urllib3']
# SNI only *really* works if we can read the subjectAltName of certificates.
HAS_SNI = SUBJ_ALT_NAME_SUPPORT
# Map from urllib3 to PyOpenSSL compatible parameter-values.
_openssl_versions = {
ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD,
**ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD,**
ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
}
_openssl_verify = {
ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER
+ OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
}
有人可以告诉我如何解决这个问题吗?如果有人有线索的话那就太棒了。我用谷歌搜索了这个问题,只发现了不完整的补丁,而且很困惑。一旦这个问题得到解决,错误跟踪器也可能会遇到这种情况。我的所有 Python 包都存在这个问题。
最佳答案
这实际上是 urllib3
的问题,而不是 pyopenssl
的问题。 Debian lately compiles OpenSSL without SSLv3 support ,而 urllib3
只是假设存在支持。
问题是 fixed in commit b9b3b0102这是 urllib3
1.10 版本的一部分。
由于您使用 urllib3
作为 requests
的一部分,而该请求又由 pip
使用,因此应该足以更新为请求
的最新版本。截至撰写本文时,当前版本为 2.6.0,其中包含修复程序:
# pip install requests==2.6.0
由于先有鸡还是先有蛋的问题,您可能会在升级请求
时遇到问题。要解决此问题,您可以尝试暂时删除 pyopenssl
软件包、升级 requests
并重新安装 pyopenssl
。
此外,在尝试更新 requests
之前,您可能需要使用以下行来更新 pip
:
# sudo easy_install --upgrade pip
关于python-2.7 - 为 sslv3 问题修补 pyopenssl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28987891/