修补sslv3问题的pyopenssl

wis*_*shi 52 debian pip pyopenssl urllib3 python-2.7

我在使用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'**
Run Code Online (Sandbox Code Playgroud)

我检查了lib并尝试修补/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,
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何解决这个问题吗?如果有人有线索,这将是非常棒的.我搜索了这个问题,只发现了不完整的补丁,而且它很乱.一旦修复了错误跟踪器,也可能是一个案例.我对所有Python包都有这个问题.

sk1*_*k1p 74

这实际上是一个问题urllib3,而不是pyopenssl.Debian 最近在没有SSLv3支持的情况下编译OpenSSL,并且urllib3假设支持就在那里.

该问题已在提交b9b3b0102修复,该提交是1.10版本的一部分urllib3.

正如您使用的urllib3那样requests,反过来使用pip它,它应该足以更新到最近的版本requests.截至编写时,当前版本为2.6.0,其中包含修复:

# pip install requests==2.6.0
Run Code Online (Sandbox Code Playgroud)

requests由于鸡蛋问题,您可能会遇到升级问题.要解决此问题,您可以尝试临时删除pyopenssl软件包,升级requests并重新安装pyopenssl.

此外,您可能希望pip在尝试更新之前使用以下行进行更新requests:

# sudo easy_install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

  • ```sudo pip install --upgrade requests```为我做了debian 8.6的技巧 (2认同)

小智 47

解决问题的另一种方法是使用

sudo easy_install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

然后通常使用pip

  • 为了清楚起见,对我有用的是上面的,然后运行'pip install requests == 2.6.0' (3认同)

Ale*_*tan 14

我收到了同样的错误.
结合以前的答案:

sudo easy_install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

我也必须跑:

sudo pip uninstall pyopenssl
sudo pip install mozdownload
Run Code Online (Sandbox Code Playgroud)

这修复了我的错误,也许它可以帮助别人.我通过谷歌搜索来到这里:

AttributeError:'module'对象没有属性'PROTOCOL_SSLv3'


bor*_*cle 6

我今天遇到了Ansible这个问题.我解决了它: pip uninstall pyopenssl

也许这会帮助处于相同情况的其他人