python-2.7 - 为 sslv3 问题修补 pyopenssl

标签 python-2.7 debian pip pyopenssl urllib3

我在使用 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/

相关文章:

python-3.x - Pip 找不到模块 pip._internal.utils

docker - 如何在 jenkins 的 docker 容器中运行 redis?

linux - 在 debian 7 上安装 libssl0.9.8

python - 线程处理时未执行的函数

python - 将时间单位作为变量传递给时间增量函数中的关键字参数。

c# - 错误 : SIGSEGV when running application on Mono

python - pip3 输出换行符而不是安装

Python 看不到带有 Jupyter Notebook 的包

python - 如何从 StringIO 对象中删除第一个字符?

python : Cannot find any functions within my own module?