在MacOS 10.15 Beta (19A582a)上,Python因"/usr/lib/libcrypto.dylib"而崩溃。

67

我在新的macOS Catalina上运行我的Django项目,一切正常。
然后我安装了oh_my_zsh,尝试再次运行同样的项目,但是出现以下错误导致崩溃。我卸载了oh_my_zsh并尝试重新运行,但是仍然无法工作。

Path:                  /usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python
Identifier:            Python
Version:               3.7.4 (3.7.4)
Code Type:             X86-64 (Native)
Parent Process:        Python [7526]
Responsible:           Terminal [7510]
User ID:               501

Date/Time:             2019-10-07 20:59:20.675 +0530
OS Version:            Mac OS X 10.15 (19A582a)
Report Version:        12
Anonymous UUID:        CB7F20F6-96C0-4F63-9EC5-AFF3E0989687


Time Awake Since Boot: 3000 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
/usr/lib/libcrypto.dylib
abort() called
Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI.


1
如果你正在使用 virtualenv:对我来说有效的方法是(完全)重置 venv(删除它并重新创建带有所有依赖项等)。 - basti
14个回答

129
我刚遇到了同样的问题,手动链接东西让我感到有些不舒服。
我通过简单地{{解决问题}}来解决了这个问题。
  1. Installing openssl via homebrew:
    brew install openssl
    
  2. Pointing towards the dynamic libraries from openssl via DYLD_LIBRARY_PATH:
    export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH
    

我刚刚在我的.zshrc文件中添加了那行代码。

编辑:根据这个问题,使用DYLD_FALLBACK_LIBRARY_PATH可能比DYLD_LIBRARY_PATH更可取。

编辑2:如下评论所述,这个答案可能应该被接受。只需重新安装cryptography软件包即可。


这个命令在命令行中对我也起作用,但是在脚本中却不行。可能有什么东西丢失了吗? - ErnestoE
2
可以确认 export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/opt/openssl/lib 的确像你描述的那样有效。感谢你的提示! - Luke Hoersten
1
这很适合让事情开始运作,但并没有完全解决它。我有一些需要使用Python的crontab作业,我不想确保它们都有这个环境设置。我喜欢@Andrei在下面提供的解决方案。它设置了符号链接到最新的openssl libs,以便将来升级时链接也会更新。https://dev59.com/ZFMH5IYBdhLWcg3wyy3F#58596931 - Chris
4
在尝试以下回答之前,每个人都应该尝试@tonyStarks的回答,可能只是需要简单的卸载和重新安装。 - Micheal C Wallas
我的问题通过这个得到了解决:https://dev59.com/KVUL5IYBdhLWcg3wjIpQ - Shaig Khaligli
显示剩余3条评论

66

对我来说,重新安装Python的加密包就足够了。

pip uninstall cryptography
pip install cryptography

2
它对我起作用了。在我的情况下,更新virtualenv到最新版本后,ansible没有被执行。 - hshan
1
成功了!谢谢!对我来说,使用pip uninstall cryptography而不是remove就可以了。 - fzwo
这对我也解决了问题。谢谢! - andrewdcato
2
太棒了,它可以在MacOS 10.15.4上运行。非常感谢! - Meo Beo
在 MacOS 10.15.7 上工作过。谢谢! - Sankalp

43

注意:我不是安全专家,这个解决方案会涉及加密库!

我认为你的问题不是来自于zsh或oh-my-zsh。我的最佳猜测:一些与MacOS 10.15安装的加密库与Homebrew的python3安装不兼容。

以下是我用来解决问题的方法:

# Install openssl via homebrew.
# Note: According to homebrew, "openssl is keg-only, which means it was
# not symlinked into /usr/local, because Apple has deprecated use of
# OpenSSL in favor of its own TLS and crypto libraries."
brew install openssl
# Symlink those versions into /usr/local/lib, which gets Python to dynamically
# link against those instead of the version in /usr/lib/.
# Got the idea from https://forums.developer.apple.com/thread/119429
cd /usr/local/lib
sudo ln -s /usr/local/Cellar/openssl/1.0.2t/lib/libssl.1.0.0.dylib libssl.dylib
sudo ln -s /usr/local/Cellar/openssl/1.0.2t/lib/libcrypto.1.0.0.dylib libcrypto.dylib

我的背景情况:

  • 最近升级到了MacOS 10.15
  • 我使用通过homebrew安装的python/pip: brew install python
  • pip3出现SIGABRT失败

系统错误报告的标题:

Process:               Python [52429]
Path:                  /usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python
Identifier:            Python
Version:               3.7.4 (3.7.4)
Code Type:             X86-64 (Native)
Parent Process:        zsh [43309]
Responsible:           iTerm2 [2316]
User ID:               501

Date/Time:             2019-10-09 09:52:18.148 -0700
OS Version:            Mac OS X 10.15 (19A583)
Report Version:        12
Bridge OS Version:     4.0 (17P572)
Anonymous UUID:        

Sleep/Wake UUID:       

Time Awake Since Boot: 9900 seconds
Time Since Wake:       7300 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
/usr/lib/libcrypto.dylib
abort() called
Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI.

24

我更喜欢@bixel、@Juro Oravec和@honkaboy答案的结合:

brew install openssl
cd /usr/local/lib
sudo ln -s /usr/local/opt/openssl/lib/libssl.dylib libssl.dylib
sudo ln -s /usr/local/opt/openssl/lib/libcrypto.dylib libcrypto.dylib

理论上来说,更新openssl时,dylibs将始终指向最新版本。 /usr/local/opt/openssl 实际上是一个链接到 /usr/local/Cellar/openssl/Cellar/openssl/1.0.2t (由brew安装的openssl版本)。

问题出现的原因实际上由brew解释:

openssl是“keg-only”,这意味着它没有被建立符号链接到/usr/local, 因为苹果已经弃用了OpenSSL,而改用自己的TLS和加密库。

尝试运行 brew link openssl:

警告:拒绝链接macOS提供的软件:openssl 如果您需要 将openssl放在PATH中的第一位,请运行: echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

为使编译器找到openssl,您可能需要设置: export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/usr/local/opt/openssl/include"

为使pkg-config找到openssl,您可能需要设置: export PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig"

因此,基本上您需要手动链接它们。


16

这个苹果开发者社区的帖子中的r.xuan指出了解决方案的步骤Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI.,即将/usr/local/lib中的libssl.dyliblibcrypto.dylib链接替换为来自Homebrew install 的openssl的库。

具体步骤如下:

获取新的库文件

1) brew update && brew upgrade && brew install openssl

2) cd /usr/local/Cellar/openssl/1.0.2t/lib

3) sudo cp libssl.1.0.0.dylib libcrypto.1.0.0.dylib /usr/local/lib/

备份原有库文件

4) cd /usr/local/lib

5) mv libssl.dylib libssl_bak.dylib

6) mv libcrypto.dylib libcrypto_bak.dylib

创建新的链接

7) sudo ln -s libssl.1.0.0.dylib libssl.dylib

8) sudo ln -s libcrypto.1.0.0.dylib libcrypto.dylib


这对我在Catalina 10.15.4上有效,但我使用了等效的文件/usr/local/Cellar/openssl@1.1。使用x.1.0.0.dylib文件,pip3仍然崩溃。 - mandrewsan

5
我曾经遇到与ansible类似的问题。罪魁祸首是asn1crypto,这个问题已经得到修复。
我的解决方案是手动卸载asn1crypto并使用pip重新安装:
1. 删除 /usr/local/lib/python2.7/site-packages/asn1crypto*,使pip能够正常工作。 2. 安装asn1crypto 1.2.0: pip install asn1crypto。
  Found existing installation: asn1crypto 0.24.0
    Uninstalling asn1crypto-0.24.0:
      Successfully uninstalled asn1crypto-0.24.0
Successfully installed asn1crypto-1.2.0

注意: 您可以通过以详细模式运行 python(例如python -v $(which ansible))来检查是否是 asn1crypto 导致的问题。在我的情况下,它在执行一些与asn1crypto有关的导入时崩溃了:

# /usr/local/lib/python2.7/site-packages/asn1crypto/_perf/_big_num_ctypes.pyc matches /usr/local/lib/python2.7/site-packages/asn1crypto/_perf/_big_num_ctypes.py
import asn1crypto._perf._big_num_ctypes # precompiled from /usr/local/lib/python2.7/site-packages/asn1crypto/_perf/_big_num_ctypes.pyc
[1]    59247 abort      python -v $(which ansible)

相关链接:https://github.com/Homebrew/homebrew-core/issues/44996


这是对我有效的方法。我使用了roots的trellis,它使用ansible。我按照答案中列出的rm -r命令进行操作,然后删除了位于trellis/.trellis/virtualenv目录下的python环境,接着使用trellis-cli执行了trellis init命令,重新创建了一个python环境并使用pip安装了依赖项。 - robrecord

4

必须使用一些依赖项,如密码学

解决方案:

cd your-site-packages-path/
vim ./asn1crypto/_int.py

找到这行代码,删除它,一切就好了。

# from ._perf._big_num_ctypes import libcrypto

这是我的问题

Process:               Python [85179]
Path:                  /usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python
Identifier:            Python
Version:               3.7.4 (3.7.4)
Code Type:             X86-64 (Native)
Parent Process:        ??? [85161]
Responsible:           iTerm2 [11711]
User ID:               501

Date/Time:             2019-10-07 23:00:25.143 +0800
OS Version:            Mac OS X 10.15 (19A582a)
Report Version:        12
Bridge OS Version:     3.0 (14Y906)
Anonymous UUID:        32C73ADD-1291-FA0E-DC02-48D539674325


Time Awake Since Boot: 42000 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
/usr/lib/libcrypto.dylib
abort() called
Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI.

2
很抱歉,这些答案都无法满足我的要求。因为这些答案没有解决问题的根本原因。其中一些是幸运的,或者误解了问题,甚至是错误的。因此,我将提供自己的解决方案,并详细解释问题。
引起问题的根本原因非常明显。您的Python正在尝试打开(通过dlopen)一个名为libcrypto的未版本化的OpenSSL共享库。由于Catalina之后,出于安全原因,苹果不允许任何人使用它。因此,解决方案很简单。只需使用带版本号的OpenSSL即可。
我编写了一个名为openlib.py的Python脚本来重现这个问题。
import sys
from ctypes.util import find_library
from ctypes import CDLL

name = sys.argv[1]
path = find_library(name)
print(f"path: {path}")
lib = CDLL(path)

我在这里使用系统自带的 Python 进行演示。
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H15
$ /usr/bin/python3 --version
Python 3.8.2
$ ls -al /usr/lib/ | grep 'libcrypto\|libssl'
.rwxr-xr-x 1.1M root 22 Sep  8:29 libcrypto.0.9.7.dylib
.rwxr-xr-x 1.4M root 22 Sep  8:29 libcrypto.0.9.8.dylib
.rwxr-xr-x 1.5M root 22 Sep  8:29 libcrypto.35.dylib
.rwxr-xr-x 1.5M root 22 Sep  8:29 libcrypto.41.dylib
.rwxr-xr-x 1.5M root 22 Sep  8:29 libcrypto.42.dylib
.rwxr-xr-x 1.5M root 22 Sep  8:29 libcrypto.44.dylib
.rwxr-xr-x  32k root 22 Sep  8:29 libcrypto.dylib
.rwxr-xr-x 212k root 22 Sep  8:29 libssl.0.9.7.dylib
.rwxr-xr-x 335k root 22 Sep  8:30 libssl.0.9.8.dylib
.rwxr-xr-x 330k root 22 Sep  8:28 libssl.35.dylib
.rwxr-xr-x 313k root 22 Sep  8:29 libssl.43.dylib
.rwxr-xr-x 300k root 22 Sep  8:29 libssl.44.dylib
.rwxr-xr-x 294k root 22 Sep  8:29 libssl.46.dylib
.rwxr-xr-x  32k root 22 Sep  8:29 libssl.dylib
$ /usr/bin/python3 openlib.py libcrypto
path: /usr/lib/libcrypto.dylib
Abort trap: 6
$ /usr/bin/python3 openlib.py libcrypto.35
path: /usr/lib/libcrypto.35.dylib
$ /usr/bin/python3 openlib.py libcrypto.44
path: /usr/lib/libcrypto.44.dylib

正如您所看到的,Python 因为参数 libcrypto 崩溃了,以下是诊断报告。看起来很相似,对吧?Bingo!
Process:               Python [97291]
Path:                  /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/Resources/Python.app/Contents/MacOS/Python
Identifier:            Python
Version:               3.8.2 (3.8.2)
Build Info:            python3-73040006000000~117
Code Type:             X86-64 (Native)
Parent Process:        bash [84388]
Responsible:           iTerm2 [7705]
User ID:               501

Date/Time:             2020-12-26 00:28:00.281 +0800
OS Version:            Mac OS X 10.15.7 (19H15)
Report Version:        12
Anonymous UUID:        1C43F3DB-1783-4B94-B663-7F7E8D331B56


Time Awake Since Boot: 53000 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_CRASH (SIGABRT)
Exception Codes:       0x0000000000000000, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Application Specific Information:
/usr/lib/libcrypto.dylib
abort() called
Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI.

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib          0x00007fff69bba33a __pthread_kill + 10
1   libsystem_pthread.dylib         0x00007fff69c76e60 pthread_kill + 430
2   libsystem_c.dylib               0x00007fff69b41808 abort + 120
3   libcrypto.dylib                 0x00007fff6766b7e4 __report_load + 415

基于您的Python路径/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python。显然,您的Python是通过Homebrew安装的。我相信Homebrew Python 3已经与keg-only OpenSSL链接。因此,必须有一些使用未命名OpenSSL的软件包。查看文件ctypes/macholib/dyld.py2。它按照指定顺序搜索以下目录中的任何库:
DEFAULT_LIBRARY_FALLBACK = [
    os.path.expanduser("~/lib"),
    "/usr/local/lib",
    "/lib",
    "/usr/lib",
]

$ /usr/bin/python3
Python 3.8.2 (default, Nov  4 2020, 21:23:28)
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes.util import find_library
>>> find_library('libcrypto')
'/usr/lib/libcrypto.dylib'
>>>

因此,简单的解决方法是将 OpenSSL 的版本链接到您的主目录中的库路径。
$ pwd
/Users/gasolwu
$ ln -s /usr/lib/libcrypto.44.dylib $HOME/lib/libcrypto.dylib
$ $ ls ~/lib
libcrypto.dylib

之后,请通过运行提供的脚本openlib.py来测试打开OpenSSL。它将成功返回库路径,而不会崩溃。
$ /usr/bin/python3 openlib.py libcrypto
path: /Users/gasolwu/lib/libcrypto.dylib

我也使用Homebrew Python 3。所以我在几天前修复了它,并发送了拉取请求。如果你已经升级到最新版本的Python,如果PR已经合并并且瓶子已经构建和发布。只需运行brew reinstall python@3.9命令就可以最简单地解决问题。 不要通过禁用SIP并使用sudo覆盖系统的OpenSSL来破坏您的系统。 不要安装浪费您磁盘空间的重复库。没有必要在任何位置安装另一个OpenSSL。 不要像下面这样使用环境变量DYLD_LIBRARY_PATH。如果您不将此行添加到shell的配置中,则每次都必须声明。如果这样做,它将影响您机器上的每个程序。
export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH

最后,如果您通过更新Python依赖项来解决问题,那么您可能很幸运。一些软件包通过寻找版本化的OpenSSL来修复了这个问题,但是许多软件包没有这样做。

非常好的建议,我已经认真考虑了。我非常感谢这些建议。此外,Gasol,我建议将“不要”行加粗,因为对于那些寻求快速解决方案的人来说,它看起来就像是一大块文本。幸运的是,“不要”的字眼引起了我的注意,但其他人可能就没有这么幸运了。 - developer01
1
@developer01 我已经做了,感谢您的评论。 - Gasol
不用谢!! - developer01

1

尝试:

python3 -m pip install oscrypto

对我有用!


0

跟随上面提到的答案,想要链接libssl.dylib文件,但发现以下位置不存在:

/usr/local/Cellar/openssl/1.0.2t/lib/

然而,正如@bixel所接受的答案所发现的那样,文件位于以下位置

/usr/local/opt/openssl/lib

对我来说它起作用了。


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