【问题标题】:Patch pyopenssl for sslv3 issue为 sslv3 问题修补 pyopenssl
【发布时间】:2015-05-13 07:37:32
【问题描述】:

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

我检查了 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,
}

有人能告诉我如何解决这个问题吗?如果有人有线索,那就太棒了。我用谷歌搜索了这个问题,只发现不完整的补丁,而且很乱。一旦这个问题得到修复,也可能是错误跟踪器的一个案例。我对所有 Python 包都有这个问题。

【问题讨论】:

    标签: python-2.7 debian pip pyopenssl urllib3


    【解决方案1】:

    这实际上是urllib3 的问题,而不是pyopenssl 的问题。 Debian lately compiles OpenSSL without SSLv3 supporturllib3 只是假设那里有支持。

    问题是fixed in commit b9b3b0102,它是urllib3 1.10 版本的一部分。

    由于您将urllib3 用作requests 的一部分,而pip 又使用了pip,因此更新到requests 的最新版本就足够了。在撰写本文时,当前版本是 2.6.0,其中包含修复:

    # pip install requests==2.6.0
    

    您可能会遇到升级requests 的问题,因为鸡蛋问题。要解决此问题,您可以尝试暂时删除pyopenssl 软件包,升级requests 并重新安装pyopenssl

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

    # sudo easy_install --upgrade pip
    

    【讨论】:

    • 在我的自定义脚本中,我通过移动到 PROTOCOL_TLSv1(而不是 PROTOCOL_SSLv3)来解决它。感谢提示@sk1p
    • sudo pip install --upgrade requests 为我在 debian 8.6 上成功了
    • 我有 .21 版本的请求,但问题仍然存在。尝试了你所做的但没有工作
    【解决方案2】:

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

    sudo easy_install --upgrade pip
    

    然后正常使用 pip

    【讨论】:

    • 明确一点,对我有用的是上面的方法,然后运行 ​​'pip install requests==2.6.0'
    • 确认!如@Oliver Block 所述,这与pip install requests==2.6.0 结合使用。非常感谢!
    • 请注意,如果您在 virtualenv 中,请不要使用 sudo
    【解决方案3】:

    我收到了同样的错误。
    结合前面的答案:

    sudo easy_install --upgrade pip
    

    我也不得不跑:

    sudo pip uninstall pyopenssl
    sudo pip install mozdownload
    

    这解决了我的错误,也许它可以帮助其他人。我是通过谷歌搜索来到这里的:

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

    【讨论】:

      【解决方案4】:

      我今天在使用 Ansible 时遇到了这个问题。我解决了它: pip uninstall pyopenssl

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

      【讨论】:

      • 同样适用于 docker 中的情况。
      • 这解决了我的问题,以前我应用 sk1p 答案没有运气。我不需要像 AlexTartan 建议的那样安装 mzdownload。
      【解决方案5】:

      我从 Ubuntu 14 升级到 16 后收到此错误。升级更改了一些 Python 路径,这破坏了一些核心包。 This answer 基本上为我修复了它。

      sudo apt-get purge python-pkg-resources
      sudo apt-get -f install
      sudo rm -Rf /usr/local/bin/pip
      sudo apt-get install python-pip
      sudo pip install -U pip
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,我只是卸载了requests的版本并使用以下命令安装了确切的版本。

        pip install requests==2.6.0

        然后就可以了

        【讨论】:

          【解决方案7】:

          我在一个新的 Xenial 上遇到了这个问题,但我看到了很多答案都没有成功(有些我真的没有尝试过,因为我的大多数软件都是最新的)。最终为我解决的问题是: sudo pip install requests --upgrade ... 这只是对其他请求升级建议的一个转折。

          【讨论】:

            猜你喜欢
            • 2017-04-29
            • 1970-01-01
            • 1970-01-01
            • 2020-03-11
            • 1970-01-01
            • 1970-01-01
            • 2021-03-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多