66

我用新的 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.

4

14 回答 14

129

我刚刚遇到了同样的问题,并且对手动链接事物感到有点不舒服。

我能够通过简单地解决问题

  1. 通过自制软件安装 openssl:
    brew install openssl
    
  2. 通过 DYLD_LIBRARY_PATH 从 openssl 指向动态库:
    export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH
    

我刚刚将该行添加到我的 .zshrc 中。

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

编辑 2:正如下面的评论中提到的,可能应该是公认的答案。只需重新安装cryptography软件包。

于 2019-10-18T07:16:58.867 回答
63

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

pip uninstall cryptography
pip install cryptography
于 2020-01-02T19:18:43.993 回答
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
  • 我使用通过自制软件安装的 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.
于 2019-10-09T17:59:51.677 回答
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 时,dylib 将始终指向最新版本。/usr/local/opt/openssl实际上是一个链接/usr/local/Cellar/openssl/Cellar/openssl/1.0.2t(brew安装的openssl版本)。

问题发生的原因实际上是由 brew 解释的:

openssl 仅限于小桶,这意味着它没有符号链接到 /usr/local,因为 Apple 已弃用 OpenSSL 以支持其自己的 TLS 和加密库。

试图运行brew link openssl

警告:拒绝链接 macOS 提供的软件:openssl 如果您需要在 PATH 中首先使用 openssl,请运行: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"

所以,基本上你需要手动链接它们。

于 2019-10-28T19:03:24.933 回答
16

来自此 Apple Dev 线程的 r.xuan确定了解决该错误的步骤,方法是 将和链接Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI. 替换为Homebrew 安装的库的链接。libssl.dyliblibcrypto.dylib/usr/local/libopenssl

步骤是:

获取新鲜的库

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

于 2019-10-14T19:56:33.630 回答
5

我看到类似的问题ansible。罪魁祸首是asn1crypto,问题已经解决了。

我的解决方案是手动删除它并重新安装它pip

  1. rm -r /usr/local/lib/python2.7/site-packages/asn1crypto*. 这允许pip毫无问题地工作。
  2. pip install asn1crypto,安装1.2.0
  Found existing installation: asn1crypto 0.24.0
    Uninstalling asn1crypto-0.24.0:
      Successfully uninstalled asn1crypto-0.24.0
Successfully installed asn1crypto-1.2.0

注意:您可以通过在详细模式下运行来检查是否asn1crypto是罪魁祸首python,例如python -v $(which ansible)。就我而言,它在执行一些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

于 2019-12-06T22:25:42.773 回答
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.
于 2019-10-08T03:18:39.103 回答
1

恐怕这些答案都不是我可以接受的。因为这些答案并没有解决问题。他们中的一些人是幸运的,或者误解了,甚至是错误的。因此,我将提供自己的解决方案并详细解释该问题。

dylib 加载无效。客户端不应加载未版本化的 libcrypto dylib,因为它没有稳定的 ABI。

根本原因本身就很清楚了。您的 Python 正试图打开(通过dlopen)一个名为 的未版本化 OpenSSL 共享库libcrypto。自 Catalina 以来,出于安全原因,Apple 不允许任何人使用它。所以解决方案很简单。只是使用版本控制 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

如你看到的。Pythonlibcrypto因以下诊断报告的参数而崩溃。看起来很相似,对吧?答对了!

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 已与仅桶装 OpenSSL 相关联。所以肯定是一些包使用了未版本化的 OpenSSL。查看文件ctypes/macholib/dyld.py 2。它按指定顺序搜索以下目录中的任何库:

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

在那之后。通过运行提供的脚本来测试打开 OpenSSL openlib.py。它成功返回库路径而不会崩溃。

$ /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 解决了这个问题。但很多不是。

于 2020-12-25T17:28:37.790 回答
1

尝试:

python3 -m pip install oscrypto

为我工作!

于 2020-02-03T16:35:44.920 回答
0

按照上面提到的答案,想链接 libssl.dylib 文件但发现没有如下位置:

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

但是,@bixel 接受的答案在以下位置找到了文件

/usr/local/opt/openssl/lib

它对我有用。

于 2020-02-24T12:52:07.590 回答
0

如果您使用的是DevMate的 Kevlar ,请升级到 4.3.1,其中“修复了由 libcrypto.dylib 版本导致的 macOS Catalina 崩溃”。

于 2019-12-09T03:01:50.143 回答
0

使用以下步骤解决:</p>

  • 冲泡更新 && 冲泡升级 && 冲泡重新安装 openssl
  • cd /usr/local/Cellar/openssl@1.1/1.1.1g/lib
  • sudo cp libssl.1.1.1.dylib libcrypto.1.1.1.dylib /usr/local/lib/
  • sudo ln -s libssl.1.0.0.dylib libssl.dylib
  • sudo ln -s libcrypto.1.0.0.dylib libcrypto.dylib`
于 2020-06-29T10:24:29.710 回答
0

我在使用ctypes.cdll打开/usr/lib/libcrypto.dylib时遇到了同样的问题Python 3.7。但是dylib可以用Python 2.7.

我安装了最新版本opensslbrew install然后按照他们上面的建议设置环境变量并创建链接,没有发生任何好事。

经过几个小时的挖掘,我找到了一个解决方法。

libcrypto.X.dylib/usr下面找到了一些,

/usr/lib/libcrypto.dylib
/usr/lib/libcrypto.0.9.7.dylib
/usr/lib/libcrypto.0.9.8.dylib
/usr/lib/libcrypto.35.dylib
/usr/lib/libcrypto.41.dylib
/usr/lib/libcrypto.42.dylib
/usr/lib/libcrypto.44.dylib

/usr/local/opt/openssl/lib/libcrypto.1.1.dylib
/usr/local/opt/openssl/lib/libcrypto.dylib

首先,我用下面的一个来代替它/usr/lib

os.environ['DYLD_FALLBACK_LIBRARY_PATH'] = '/usr/local/opt/openssl/lib'

它可以加载,但缺少一些 api,

AttributeError: dlsym(0x..., ECDH_OpenSSL): symbol not found

/usr/lib/libcrypto.X.dylib我在我的脚本路径中创建了一个链接。

ln -s /usr/lib/libcrypto.X.dylib lib/libcrypto.dylib

然后添加路径DYLD_FALLBACK_LIBRARY_PATH

os.environ['DYLD_FALLBACK_LIBRARY_PATH'] = 'lib' # It should be a absolute path

最后,它奏效了。

于 2020-04-13T08:48:00.433 回答
0

看起来这是一个自制的问题。我做到了brew reinstall python3,它奏效了。

于 2019-12-19T19:46:09.167 回答