Python引用旧版SSL版本

20

我在我旧的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

1
哦,我的天啊,0.9.7... 你需要迁移到0.9.8。1.0.1 不是 二进制兼容的。 - jww
你需要重新编译Python以支持更新的OpenSSL。 - Paul Kehrer
@Paul - Python是否使用静态链接?我认为它使用动态链接到OpenSSL。从Modules/Setup.dist中可以看到:-L$(SSL)/lib -lssl -lcrypto。如果是动态的,他只需要设置LD_PRELOAD,指向0.9.8共享对象,然后启动Python即可。 - jww
取决于平台,但可能是任何一种。查看 ssl.OPENSSL_VERSION 底层实现,如果是动态的,它将显示加载的库(而不仅仅是最初链接的库),因此值得尝试 LD_PRELOAD - Paul Kehrer
9个回答

24

经过几天的努力,我已经解决了这个问题。适用于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版本


1
你刚刚救了我的夜晚!我浪费了好几个小时,非常抱歉让你浪费了几天的时间,但是非常感谢你分享这个!! - Naomi See
2
安装Python时,它会显示“警告:python:此公式没有--with-brewed-openssl选项,因此将被忽略!” - Guglie
我会编辑你的帖子中的 >,因为我在复制指令时不小心删除了 brew 文件。 - htafoya
对于我来说,我需要执行brew uninstall --ignore-dependencies pythonbrew uninstall --ignore-dependencies openssl来忽略依赖关系。 - alexopoulos7
我已经试图修复这个问题很长时间了。谢谢。 - iGallina

9

2018年在MacOS上的处理方法
我尝试了其他答案,但都没有成功:

  • --with-brewed-openssl选项会提示警告:python:此公式没有 --with-brewed-openssl 选项,因此将被忽略!
  • 而命令brew link openssl --force会提示警告:拒绝链接:openssl

我通过以下方式解决了问题:

brew install openssl
brew install python@2

然后。
openssl version

并且

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

给我相同的OpenSSL版本。


1
这是2019年的事情,它解救了我。不过,我不得不通过 brew upgrade python@2 升级我的 Python2。 - kip2

6
请参考http://rkulla.blogspot.kr/2014/03/the-path-to-homebrew.html
我遇到了和你一样的问题,所以我搜索了几个答案,但都没有帮助我。
  1. 更新Python 2.7中的openssl
  2. 使用Homebrew更新OS X上的OpenSSL
  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。因此,我安装了新的python并使用brewed openssl解决了这个问题,在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拥有,而不是root,这是Ryan所说的,但我使用了'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的解决方案,我将更新我的答案。我希望这个过程能帮助到你。


3

我发现我需要更改路径才能使用系统(升级)的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!

3

在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

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

1
我正在运行OSX 10.14.5 Mojave,并使用pyenv。
我的问题是,当Homebrew升级openssl时,Python仍在寻找旧版本。运行python -c "import ssl; print(ssl.OPENSSL_VERSION)"命令会出现以下错误:

Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

尝试了很多方法后,解决方案最终如下:
pyenv uninstall 3.6.8
pyenv install 3.6.8

构建日志中的魔法行是:

python-build:使用来自homebrew的openssl@1.1


1
我按照上述步骤操作后仍然遇到了同样的问题。在之前所有列出的命令之后,我添加了以下命令来解决我的问题:
brew unlink openssl --force --overwrite python && brew link openssl --force --overwrite python

希望它能帮助任何人 :)

0

不得不修改这个答案以适应Homebrew 2.2.4和MacOS 10.15.3上的python3:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接