Awaria Pythona w MacOS 10.15 Beta (19A582a) z „/usr/lib/libcrypto.dylib”

47

Uruchomiłem projekt Django z nową macOS Catalina i działałem dobrze.
Zainstalowałem oh_my_zsh, a następnie próbowałem uruchomić ten sam projekt, który ulega awarii z następującymi błędami. Odinstalowałem oh_my_zsh i spróbowałem ponownie, ale to nie zadziałało.

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.
Faisal Manzer
źródło
Jeśli jesteś w virtualenv: Dla mnie zadziałał (kompletny) reset venv (usunięcie go i odtworzenie ze wszystkimi zależnościami itp.)
basti

Odpowiedzi:

94

Właśnie natknąłem się na ten sam problem i czułem się trochę nieswojo, aby ręcznie łączyć różne elementy.

Po prostu udało mi się rozwiązać problem

  1. Instalowanie openssl przez homebrew:
    brew install openssl
  2. Wskazując na biblioteki dynamiczne z openssl poprzez DYLD_LIBRARY_PATH:
    export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH

Właśnie dodałem tę linię do mojego .zshrc.

Edycja: Zgodnie z tym pytaniem użycie DYLD_FALLBACK_LIBRARY_PATHmoże być lepsze niż DYLD_LIBRARY_PATH.

Edit 2: Jak wspomniano w komentarzu poniżej, to należy prawdopodobnie Akceptowane odpowiedź. Po prostu zainstaluj ponownie cryptographypakiet.

Bixel
źródło
19
głosowanie za nie zepsucie systemu
Jingshao Chen
Działa to również dla mnie w wierszu poleceń, jednak nie działało w przypadku skryptów. Czy może czegoś brakuje?
ErnestoE,
2
Potwierdza export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/opt/openssl/libprace zgodne z opisem. Dzięki za wskazówkę!
Luke Hoersten
1
Jest to świetne do działania, ale nie rozwiązuje go całkowicie. Mam kilka zadań crontab, które wymagają użycia Pythona i nie chcę się upewnić, że wszystkie mają tę konfigurację env. Podoba mi się rozwiązanie @ Andrei poniżej. Konfiguruje dowiązania symboliczne do wszystkich najnowszych bibliotek openssl, aby po aktualizacji w przyszłości również były to linki. stackoverflow.com/a/58596931/142318
Chris
1
Każdy powinien wypróbować @tonyStarks odpowiedź poniżej przed tym, może to być łatwa odinstalowanie i ponowna instalacja dla Ciebie
Micheal C Wallas
38

Uwaga: nie jestem ekspertem od bezpieczeństwa, a to rozwiązanie jest bałaganem w bibliotekach kryptograficznych!

Nie sądzę, że twój problem wynika z zsh lub oh-my-zsh. Moje najlepsze przypuszczenie: niektóre biblioteki kryptograficzne zainstalowane w systemie MacOS 10.15 są niezgodne z python3instalacją Homebrew .

Oto, co naprawiło problem

# 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

Moja sytuacja w kontekście:

  • Ostatnio zaktualizowano do systemu MacOS 10.15
  • Używam Pythona / PIPa zainstalowanego przez HomeBrew: brew install python
  • pip3 zawodził SIGABRT

Nagłówek raportu o błędach systemu:

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.
honkaboy
źródło
29

Dla mnie wystarczyło ponownie zainstalować pakiet kryptograficzny Pythona.

pip uninstall cryptography
pip install cryptography
Tony Stark
źródło
1
To zadziałało dla mnie. W moim przypadku odpowiedź nie została wykonana po aktualizacji virtualenv do najnowszej wersji.
hshan
1
Zadziałało! Dzięki! Dla mnie było to pip uninstall cryptographyzamiast remove.
fzwo
To również mnie naprawiło. Dzięki!
andrewdcato
To działało idealnie - dzięki!
Sherm4n
Tak, to załatwiło sprawę. Dzięki!
Steffen Funke
17

Wolę kombinację odpowiedzi @bixel, @Juro Oravec i @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

W ten sposób, przynajmniej teoretycznie, podczas aktualizacji openssl dylibs zawsze będą wskazywać najnowsze wersje. /usr/local/opt/openssljest tak naprawdę linkiem do /usr/local/Cellar/openssl/Cellar/openssl/1.0.2t(wersja openssl zainstalowana przez brew).

Przyczyna tego problemu jest wyjaśniona przez napar:

openssl jest oparty tylko na beczce, co oznacza, że ​​nie został dowiązany symbolicznie do / usr / local, ponieważ Apple przestało używać OpenSSL na rzecz własnych TLS i bibliotek kryptograficznych.

Próbuję uruchomić brew link openssl:

Ostrzeżenie: Odmowa połączenia oprogramowania dostarczonego z macOS: openssl Jeśli potrzebujesz najpierw openssl w uruchomieniu PATH: echo 'export PATH = "/ usr / local / opt / openssl / bin: $ PATH"' >> ~ / .bash_profile

Aby kompilatory mogły znaleźć openssl, może być konieczne ustawienie: eksportuj LDFLAGS = "- L / usr / local / opt / openssl / lib" eksport CPPFLAGS = "- I / usr / local / opt / openssl / include"

Aby pkg-config mógł znaleźć openssl, może być konieczne ustawienie: export PKG_CONFIG_PATH = "/ usr / local / opt / openssl / lib / pkgconfig"

Zasadniczo musisz połączyć je ręcznie.

Andrei Radulescu
źródło
15

r.xuan z tego wątku Apple Dev określił kroki obejścia błędu Invalid dylib load. Clients should not load the unversioned libcrypto dylib as it does not have a stable ABI. , zastępując łącza libssl.dylibi libcrypto.dylibw /usr/local/liblinkami do bibliotek lib z instalacji Homebrew openssl.

Kroki są następujące:

Zdobądź świeże lib

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/

Utwórz kopię zapasową starych

4) cd /usr/local/lib

5) mv libssl.dylib libssl_bak.dylib

6) mv libcrypto.dylib libcrypto_bak.dylib

Utwórz nowe linki

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

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

JuroOravec
źródło
To działało dla mnie na Catalinie 10.15.4, ale miałem /usr/local/Cellar/[email protected] i użyłem równoważnych plików. Korzystając z plików x.1.0.0.dylib, pip3 nadal ulega awarii.
Andrew Delos Reyes
4

Musi to być wykorzystanie pewnych zależności, takich jak kryptografia

Rozwiązanie:

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

znajdź tę linię; usuń go, a wszystko będzie dobrze

# from ._perf._big_num_ctypes import libcrypto

Oto mój problem

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.
twocucao
źródło
4

Widziałem podobne problemy z ansible. Sprawca był asn1crypto, a problem został już rozwiązany .

Moim rozwiązaniem było ręczne usunięcie i ponowna instalacja za pomocą pip:

  1. rm -r /usr/local/lib/python2.7/site-packages/asn1crypto*. Pozwoliło to pipna pracę bez problemów.
  2. pip install asn1crypto, który zainstalował 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

UWAGA : Możesz sprawdzić, czy asn1cryptojest to winowajcą, działając pythonw trybie pełnym, np python -v $(which ansible). W moim przypadku rozbił się podczas wykonywania niektórych asn1cryptopowiązanych importów:

# /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)

Powiązane: https://github.com/Homebrew/homebrew-core/issues/44996

memoselyk
źródło
Ten działał dla mnie. Korzystałem z kratki według korzeni, która wykorzystuje ansible. Wykonałem rm -rpolecenie zgodnie z listą w odpowiedzi, następnie usunąłem środowisko Pythona z trellis/.trellis/virtualenvkatalogu, a następnie zrobiłem to za pomocą trellis-cli, trellis initktóre odtworzyło środowisko Pythona i zainstalowało zależności za pomocą pip.
robrecord,
To zadziałało dla mnie :)
smartworld-dm
0

Jeśli używasz Kevlaru z DevMate , zaktualizuj do wersji 4.3.1, która „ Naprawiła awarię macOS Catalina spowodowaną wersją libcrypto.dylib”.

Zimowy
źródło
0

Wygląda na to, że był to problem Homebrew. Zrobiłem brew reinstall python3i zadziałało.

mylittleswift
źródło
0

Próbować:

python3 -m pip install oscrypto

Pracował dla mnie!

Abdul Rahman
źródło
0

Aby postępować zgodnie z powyższymi odpowiedziami, chciałem połączyć plik libssl.dylib, ale nie znalazłem takiej lokalizacji jak poniżej:

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

Jednak jako zaakceptowana odpowiedź @bixel znalazła plik w poniższej lokalizacji

/usr/local/opt/openssl/lib

i zadziałało dla mnie.

reaganRezvi
źródło
0

Poznałem ten sam problem gdy używałem ctypes.cdllotworzyć /usr/lib/libcrypto.dylibz Python 3.7. Jednak dylibMOGĄ zostać otwarte za pomocą Python 2.7.

Zainstalowałem najnowszą opensslwersję brew install, następnie ustawiłem zmienne środowiskowe i utworzyłem linki zgodnie z powyższymi sugestiami, NIC się nie wydarzyło.

Po kilku godzinach kopania znalazłem rozwiązanie obejścia.

Znalazłem kilka libcrypto.X.dylibw /usrjak następuje,

/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

Po pierwsze, /usr/libzamiast tego użyłem następującego .

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

Można go załadować, ale brakuje niektórych apis,

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

W /usr/lib/libcrypto.X.dylibścieżce skryptu utworzyłem link .

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

Następnie dodaj ścieżkę do DYLD_FALLBACK_LIBRARY_PATH

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

W końcu zadziałało.

Song Bi
źródło