【问题标题】:Python referencing old SSL versionPython 引用旧 SSL 版本
【发布时间】:2014-08-11 00:14:44
【问题描述】:

我在一个旧的 nas 盒子上有一个 Dropbox 上传脚本,最近我收到以下错误

SSL 证书错误:[Errno 1] _ssl.c:504: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm

我认为这是由于包装盒上的 openssl 已过时

所以我下载了 openssl,从源代码构建并安装了它,现在当我运行以下命令时,它似乎已正确更新。

openssl version
OpenSSL 1.0.1h 5 Jun 2014

但是看起来 Python 仍然在引用旧版本,我该如何更新它?

python -c "import ssl; print ssl.OPENSSL_VERSION"
OpenSSL 0.9.7m 23 Feb 2007

【问题讨论】:

  • 天哪,0.9.7...您需要迁移到 0.9.8。 1.0.1 二进制兼容。
  • 您需要针对较新的 OpenSSL 重新编译 Python。
  • @Paul - Python 是否静态链接?我认为它使用动态链接到 OpenSSL。来自Modules/Setup.dist-L$(SSL)/lib -lssl -lcrypto。如果是动态的,他只需要设置LD_PRELOAD,指向0.9.8的共享对象,然后启动Python。
  • 取决于平台,但也可以。查看底层ssl.OPENSSL_VERSION 的实现,它将显示它加载的动态库(不仅仅是它最初链接的库),因此可能值得尝试LD_PRELOAD

标签: python ssl openssl dropbox-api nas


【解决方案1】:

请参考http://rkulla.blogspot.kr/2014/03/the-path-to-homebrew.html

我遇到了和你一样的问题,所以我搜索了几个答案,但它没有帮助我。

  1. Updating openssl in python 2.7
  2. Update OpenSSL on OS X with Homebrew
  3. https://apple.stackexchange.com/questions/126830/how-to-upgrade-openssl-in-os-x

在 MAC 上通过 homebrew 将 openssl 升级到 1.0.1j 后,系统 python 仍然引用旧版本 0.9.8。原来python指的是openssl。所以我用 brewed openssl 安装了新的 python 并在 Mac 上完成了这个问题,而不是 Ubuntu。

在Mac OS X 10.10版和系统python 2.7.6版上,我的程序如下。

  1. $ brew update
  2. $ brew install openssl. 然后可以看到openssl 1.0.1j版本。
  3. $ brew link openssl --force
  4. $ brew install python --with-brewed-openssl. 你必须用 brewed openssl 安装新的 python。然后,您可以看到 /usr/local/Cellar/python/2.7.8_2/bin/python。
  5. $ sudo ln -s /usr/local/Cellar/python/2.7.8_2/bin/python /usr/local/bin/python. 当然,/usr/local/* 应该由 $USER 拥有,而不是由 Ryan 告诉的 root,但我使用了 'sudo'。而且,在这条指令之前,我没有 /usr/local/bin/python。在此指令之后,您可以使用 python 版本 2.7.8 而不是 2.7.6。

最后,你可以看到如下;

$ python --version

Python 2.7.8

$ python -c "import ssl; print ssl.OPENSSL_VERSION"

OpenSSL 1.0.1j 2014 年 10 月 15 日

到目前为止,我正在 Ubuntu 12.04 上开发它。如果我有适用于 Ubuntu 12.04 的解决方案,那么我会更新我的答案。我希望这个过程对你有所帮助。

【讨论】:

    【解决方案2】:

    这对我有用。

    python -c "import ssl; print ssl.OPENSSL_VERSION"
    brew link openssl --force
    brew install python --with-brewed-openssl
    mv /usr/local/bin/python /usr/local/bin/python_old
    sudo ln -s /usr/local/Cellar/python/2.7.11/bin/python /usr/local/bin/python
    

    【讨论】:

      【解决方案3】:

      我完成了上述所有步骤,但仍然遇到同样的问题。我解决了我的问题,在前面的答案中列出的所有命令之后添加以下命令:

      brew unlink openssl --force --overwrite python && brew link openssl --force --overwrite python
      

      希望它可以帮助任何人:)

      【讨论】:

        【解决方案4】:

        几天后就搞定了。 MAC OS X El Captian 或更高版本

         sudo rm -rf /Library/Frameworks/Python.framework/Versions/2.7
         sudo rm -rf "/Applications/Python 2.7"
         cd /usr/local/bin/
         ls -l /usr/local/bin | grep '../Library/Frameworks/Python.framework/Versions/2.7' | awk '{print $9}' | tr -d @ | xargs rm
         brew uninstall python
         brew uninstall openssl
         brew link --force openssl
        

        现在再次使用 brew 安装 python 和 openssl。

         brew install openssl
         brew install python --with-brewed-openssl
        

        将以下内容添加到 MAC 上 ~/.bash_profile 的 PATH 中

         vi ~/.bash_profile
         export PATH=/usr/local/opt/openssl/bin:/usr/local/opt/python/libexec/bin:$PATH
        

        重启终端

         python --version (verify if it is picking up the right version)
         openssl version -a (verify if it is picking up the right version)
         python -c "import ssl; print ssl.OPENSSL_VERSION"
        

        (注意:如果您安装了 Python3,则必须在内联编译器步骤中更新 print 语法)

        python -c "import ssl; print(ssl.OPENSSL_VERSION)"
        

        应该给你最新的OPEN SSL版本

        【讨论】:

        • 你刚刚拯救了我的夜晚!失去了几个小时,非常抱歉你失去了几天,但非常感谢你分享这个!!
        • 安装 python 时显示Warning: python: this formula has no --with-brewed-openssl option so it will be ignored!
        • 我将编辑您帖子中的 >,因为我不小心删除了 brew 文件,因为我从指令中复制了 >。
        • 对我来说,我需要做 brew uninstall --ignore-dependencies python brew uninstall --ignore-dependencies openssl 来忽略依赖关系。
        • 我多年来一直在尝试解决这个问题。谢谢
        【解决方案5】:

        MacOS 上的 2018 年
        我尝试了其他答案但没有成功:

        • --with-brewed-openssl 选项给出Warning: python: this formula has no --with-brewed-openssl option so it will be ignored!
        • 命令brew link openssl --force给出Warning: Refusing to link: openssl

        我得到了它的工作

        brew install openssl
        brew install python@2
        

        然后

        openssl version
        

        python -c "import ssl; print ssl.OPENSSL_VERSION"
        

        给了我相同的 OpenSSL 版本。

        【讨论】:

        • 现在是 2019 年,这救了我。但是,我不得不升级我的 python2:brew upgrade python@2
        【解决方案6】:

        我发现我必须更改 PATH 才能使用系统(升级)SSL:

        $ pip install --editable .
        
        Obtaining file:///Users/jhlynch/Projects/flaskr
        Collecting flask (from flaskr==0.0.0)
          Could not fetch URL https://pypi.python.org/simple/flask/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:661) - skipping
          Could not find a version that satisfies the requirement flask (from flaskr==0.0.0) (from versions: )
        No matching distribution found for flask (from flaskr==0.0.0)
        
        $ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
        
        OpenSSL 0.9.8zh 14 Jan 2016                      <<< note older version
        
        
        $ echo $PATH
        /Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Users/jhlynch/.nix-profile/bin:/Users/jhlynch/.nix-profile/sbin:/Users/jhlynch/.nix-profile/lib/kde4/libexec:/nix/var/nix/profiles/default/bin:/nix/var/nix/profiles/default/sbin:/nix/var/nix/profiles/default/lib/kde4/libexec:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
        
        $ PATH="/usr/local/bin:/usr/local/sbin:${PATH}"
        
        $ export PATH
        
        $ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
        
        OpenSSL 1.0.2o  27 Mar 2018                       <<< note newer version
        
        $ pip install --editable .
        
        Obtaining file:///Users/jhlynch/Projects/flaskr
        Collecting flask (from flaskr==0.0.0)
          Downloading https://files.pythonhosted.org/packages/77/32/e3597cb19ffffe724ad4bf0beca4153419918e7fa4ba6a34b04ee4da3371/Flask-0.12.2-py2.py3-none-any.whl (83kB)
        ...                <<< works this time!
        

        【讨论】:

          【解决方案7】:

          OSX Sierra,Python 3.7,同样的问题,重新安装/更新 Python 和 OpenSSL 并没有帮助解决这个特定问题(但我猜还是有用的)。

          基本解决方案:清理.bash_profile 中的$PATH!我不得不手动删除一堆过时的目录 (/Library/Frameworks/Python.framework/Versions/3.4/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages:/Library/Frameworks/Python.framework/Versions/2.7/bin)

          然后运行:

          brew link --overwrite --dry-run python

          如果一切正常,请在没有 --dry-run 的情况下重复:

          brew link --overwrite python

          结果:

          Linking /usr/local/Cellar/python/3.7.0... 25 symlinks created
          ~
          $  python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
          OpenSSL 1.0.2p  14 Aug 2018
          

          【讨论】:

            【解决方案8】:

            必须修改 this answer 才能在 MacOS 10.15.3 上使用 Homebrew 2.2.4 和 python3:

            brew unlink openssl python3 && brew link openssl python3
            echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile
            

            【讨论】:

              【解决方案9】:

              我正在运行 OSX 10.14.5 Mojave 并使用 pyenv。

              我遇到的问题是,当 Homebrew 升级 openssl 时,Python 一直在寻找旧版本。 python -c "import ssl; print(ssl.OPENSSL_VERSION)" 报错:

              库未加载:/usr/local/opt/openssl/lib/libssl.1.0.0.dylib

              在尝试了很多事情之后,解决方案原来是:

              pyenv uninstall 3.6.8
              pyenv install 3.6.8
              

              构建日志中的神奇之处是:

              python-build:使用自制软件中的 openssl@1.1

              【讨论】:

                猜你喜欢
                • 2016-07-01
                • 2019-09-02
                • 1970-01-01
                • 2022-01-23
                • 1970-01-01
                • 1970-01-01
                • 2014-02-04
                • 2012-12-15
                • 1970-01-01
                相关资源
                最近更新 更多