Доморощенный отказывается от ссылки OpenSSL


141

Я нахожусь на: OSX 10.11.6, Homebrew версия 0.9.9m OpenSSL 0.9.8zg 14 июля 2015

Я пытаюсь поиграть с dotnetcore и, следуя их инструкциям ,

Я обновил / установил последнюю версию openssl:

> brew install openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2h_1.el_capitan.bottle.tar.gz
Already downloaded: /Users/administrator/Library/Caches/Homebrew/openssl-1.0.2h_1.el_capitan.bottle.tar.gz
==> Pouring openssl-1.0.2h_1.el_capitan.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include

Но когда я пытаюсь связать openssl, я продолжаю сталкиваться с этой ошибкой связывания:

> brew link --force openssl
Warning: Refusing to link: openssl
Linking keg-only OpenSSL means you may end up linking against the insecure,
deprecated system version while using the headers from the Homebrew version.
Instead, pass the full include/library paths to your compiler e.g.:
  -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib

Возможность включать флаги компилятора не имеет смысла для меня, так как я не компилирую эти библиотеки, от которых я зависим.

РЕДАКТИРОВАТЬ dotnetcore обновил свои инструкции:

brew update    
brew install openssl    
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/    
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/

3
Для .NET Core вам нужна поддерживаемая версия OpenSSL, которая будет 1.0.1 или 1.0.2. Поскольку вы сообщаете о версии 0.9.8, может быть, вам нужно brew upgrade opensslсначала?
bartonjs

2
Я уже сделал это. Я должен был уточнить, но я не добавил эти шаги к вопросу. Но я уже сделал brew updateи brew install openssl. Это пытается установить поддерживаемую версию.
Дэвид Смерть

2
Похоже, что Homebrew явно заблокировал его: github.com/Homebrew/brew/commit/… .
bartonjs

4
И ... чтобы продолжить округлять мою болтовню, вас может заинтересовать все, что происходит на github.com/Homebrew/brew/pull/597
bartonjs

2
«... когда я пытаюсь связать openssl, я продолжаю сталкиваться с этой ошибкой связывания: ..» - также см. Как установить путь времени выполнения (-rpath) исполняемого файла с gcc под Mac OSX? , Это может помочь вам всегда загружать правильную библиотеку во время выполнения, если Brew не добавляет ее.
июня

Ответы:


63

Как следует из обновления к другому ответу, обходной путь установки старого brew openssl101 больше не будет работать. Прямой обходной путь см. В этом комментарии к dotnet / cli # 3964 .

Наиболее актуальная часть вопроса скопирована здесь:

Я посмотрел на другой вариант, который был предложен для установки rpath в библиотеке. Я думаю, что следующее является лучшим решением, которое повлияет только на эту конкретную библиотеку.

sudo install_name_tool -add_rpath /usr/local/opt/openssl/lib /usr/local/share/dotnet/shared/Microsoft.NETCore.App/1.0.0/System.Security.Cryptography.Native.dylib

и / или если у вас установлен NETCore 1.0.1, выполните ту же команду для 1.0.1:

sudo install_name_tool -add_rpath /usr/local/opt/openssl/lib /usr/local/share/dotnet/shared/Microsoft.NETCore.App/1.0.1/System.Security.Cryptography.Native.dylib

По сути, вместо того, чтобы указывать операционной системе всегда использовать доморощенную версию SSL и, возможно, что-то сломать, мы сообщаем dotnet, как найти правильную библиотеку.

Также важно то, что, похоже, Microsoft осведомлена об этой проблеме и имеет оба: а) несколько немедленный план по смягчению, а также б) долгосрочное решение (вероятностное объединение OpenSSL с dotnet).

Еще одна вещь, на которую /usr/local/opt/openssl/libстоит обратить внимание: это место, где варево связано по умолчанию:

13:22 $ ls -l /usr/local/opt/openssl
lrwxr-xr-x  1 ben  admin  26 May 15 14:22 /usr/local/opt/openssl -> ../Cellar/openssl/1.0.2h_1

Если по какой-либо причине вы устанавливаете brew и связываете его в другом месте, то этот путь следует использовать в качестве rpath.

После того, как вы обновите rpath libray System.Security.Cryptography.Native.dylib, вам необходимо перезапустить интерактивный сеанс (т. Е. Закрыть консоль и запустить еще один).


Где я должен добавить эту строку? Я пытаюсь заставить это работать в CI. Я получаю /usr/local/share/dotnet/shared/Microsoft.NETCore.App/1.0.0/System.Security.Cryptography.Native.dylib (No such file or directory).
Мрахал

@mrahhal - это путь установки dotnetинструмента. Возможно, вы либо не установили его, либо установили, либо в другое место. Если он установлен и с вашей стороны, вы можете использовать его which dotnetдля поиска.
Бен Коллинз

О, просто понял, что я добавляю эту строку перед установкой dotnet. Повторим попытку и вернемся.
Мрахал

3
Работал для меня, в моем случае SDK был установлен в другой каталог, поэтому мне пришлось изменить путь.
Мрахал

4
С DotNet 1.1.0 я должен был сделать:sudo install_name_tool -add_rpath /usr/local/opt/openssl/lib /usr/local/share/dotnet/shared/Microsoft.NETCore.App/1.1.0/System.Security.Cryptography.Native.OpenSsl.dylib
Bouke

60

Вот что сработало для меня:

brew update
brew install openssl
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/Cellar/openssl/1.0.2j/bin/openssl /usr/local/bin/openssl

Благодаря @dorlandode в этой теме https://github.com/Homebrew/brew/pull/597

NB: я использовал это только как временное исправление, пока не смогу потратить время на правильную установку Openssl заново с нуля. Насколько я помню, я провел большую часть дня, отлаживая и испытывая проблемы, прежде чем понял, что лучший способ - вручную установить необходимые мне сертификаты. Пожалуйста, прочитайте ссылку в комментарии @ bouke, прежде чем пытаться это сделать.


9
полный путь для последней ссылки /usr/local/bin/openssl?
Мохамед Хафез

Почему этот ответ не принят, ты спас мне жизнь человека. :: большой палец вверх ::
Wukong

2
Есть веская причина, по которой варево отказывается это делать. Смотрите также это: github.com/Homebrew/brew/pull/597 .
Бук

7
Это решение работало для меня, но мне пришлось перейти 1.0.2jна него 1.0.2kиз-за различий в версиях. Так что пользователи, будьте осторожны, возможно, вам придется скорректировать пути для текущей версии
Джефф

Я видел комментарий @ Джеффа слишком поздно. Если вы тоже, я думаю, ln -s -f /usr/local/Cellar/openssl/1.0.2k/bin/openssl /usr/local/bin/opensslэто
исправит

49

Ни одно из этих решений не работало для меня на OS X El Capitan 10.11.6. Вероятно, потому что OS X имеет нативную версию openssl, которая, как он считает, является превосходной, и поэтому не любит вмешиваться.

Итак, я выбрал большую дорогу и начал все заново ...


Вручную установите и символическую ссылку

cd /usr/local/src  
  • Если вы получаете «Нет такого файла или каталога», сделайте это:

    cd /usr/local && mkdir src && cd src

Скачать openssl:

curl --remote-name https://www.openssl.org/source/openssl-1.0.2h.tar.gz

Извлечение и CD в:

tar -xzvf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h

Скомпилируйте и установите:

./configure darwin64-x86_64-cc --prefix=/usr/local/openssl-1.0.2h shared
make depend
make
make install

Теперь символьная ссылка OS X openssl на ваш новый и обновленный openssl:

ln -s /usr/local/openssl-1.0.2h/bin/openssl /usr/local/bin/openssl

Закройте терминал, откройте новый сеанс и убедитесь, что OS X использует ваш новый openssl:

openssl version -a

Если вы пытаетесь установить ядро ​​.NET на OS X, вы должны обернуть его в Docker.
McGwier

6
После всего этого: OpenSSL 0.9.8zh 14 января 2016 года, построено: 15 мая 2016 года платформа: darwin64-x86_64-llvm
AsimRazaKhan

5
Создание символической ссылки следующим образом работал для меня ln -s /usr/local/openssl-1.0.2h/bin/openssl /usr/local/bin/openssl. После перезапуска сеанса терминала введите, which opensslчтобы убедиться, что вы используете обновленную версию 1.0.2 ( /usr/local/bin/openssl) вместо встроенной ( /usr/bin/openssl).
Оливье

1
Я следовал этим инструкциям, но когда я набираю openssl, я получаю (/ opt / local / bin / openssl). Как мне получить это / usr / local / bin / openssl?
Крис

2
Я следовал этим инструкциям (большое спасибо за пошаговое руководство), и он все еще сказал 0.9.8. Спасибо Оливье за ​​альтернативный метод связи, который работал.
Оникороши

45

Просто выполните brew info opensslи прочитайте информацию, где написано:

Если вам нужно сначала запустить это программное обеспечение при запуске PATH: echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile


3
brew info opensslдал такую ​​же полезную информацию для меня. Выполнение предложенной выше команды, а затем запуск source ~/.bash_profileили открытие нового терминала решили ее для меня.
PanPipes,

2
НУ НАКОНЕЦ ТО. Это также сработало для меня. Другие ответы выше не сделали!
user124384

2
илиecho 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
B.Ma

16

Если миграция вашего Mac ломает доморощенный:

Я перенес свой Mac, и он отключил все мои домашние установки - в том числе OpenSSL. Это сломалось gem install, как я впервые заметил проблему и начал пытаться исправить это.

После миллиона решений (при переходе на OSX Sierra - 10.12.5) решение оказалось комично простым:

brew reinstall ruby
brew reinstall openssl

И через год это случилось со мной, когда я перенес свой Mac, и твое исправление сработало и для меня. Спасибо; Я начал думать о том, чтобы стереть мой новый Mac, выполнить новую установку и заново все настроить вручную.
Дэвид

@ Давид рад, что я могу не дать тебе пройти через край! Я почти сделал то же самое.
Tobybot

1
Вам также может понадобиться удалить эту папку, прежде чем делать выше. rm -rf /usr/local/opt/openssl
Гал Браха,

9

Перепробовав все, что смог найти и ничего не получилось, я просто попробовал это:

touch ~/.bash_profile; open ~/.bash_profile

Внутри файла добавлена ​​эта строка.

export PATH="$PATH:/usr/local/Cellar/openssl/1.0.2j/bin/openssl"

теперь это работает :)

Jorns-iMac:~ jorn$ openssl version -a
OpenSSL 1.0.2j  26 Sep 2016
built on: reproducible build, date unspecified
//blah blah
OPENSSLDIR: "/usr/local/etc/openssl"

Jorns-iMac:~ jorn$ which openssl
/usr/local/opt/openssl/bin/openssl

1
Это действительно простое решение, и я очень надеялся, что оно сработает для меня, но не повезло. Даже после обновления моего PATH и перезапуска сеанса оболочки which opensslвсе еще указывает на/usr/bin/openssl
Уилл Хичкок,

Чтобы это работало, мне также пришлось отредактировать мой .bash_profile. Но единственное, что сработало, - это попросил его искать в / usr / local / bin вместо / usr / bin. Я сделал это, добавивexport PATH=/usr/local/bin:$PATH
Элисон

3
Для этого на работу, вам нужно добавить /usr/local/opt/openssl/bin, без/openssl на конце, к передней части PATH, а не конец: PATH=/usr/local/opt/openssl/bin:$PATH Использование /usr/local/opt/opensslвместо /usr/local/Cellar/openssl/$versionсредств вы будете автоматически поддерживать максимальную версию уточненного в ваших $ PATH без изменить его каждый раз, когда вы обновляете.
Марк Рид

После нескольких часов немоты это помогло мне вместе с дополнительными заметками @ MarkReed
Naomi See

Я смог использовать это и заставить его работать на меня. Спасибо. У меня 1.0.2q версия openssl.
Картик Н.Г.

8

У меня похожий случай. Мне нужно установить openssl через brew, а затем использовать pip для установки mitmproxy. Я получил ту же жалобу от brew link --force. Ниже приведено решение, которое я достиг: (без принудительной связи посредством варки)

LDFLAGS=-L/usr/local/opt/openssl/lib 
CPPFLAGS=-I/usr/local/opt/openssl/include
PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig 
pip install mitmproxy

Это не решает вопрос прямо. Я оставляю однострочник на тот случай, если кто-нибудь использует pip и требует openssl lib.

Примечание: /usr/local/opt/openssl/libпути полученыbrew info openssl


Нашел этот полезный для установки pysqlcipher
drtf

Полезно для установки cryptography. Я пропустил PKG_CONFIG_PATHпеременную
Сагар

7

Это сработало для меня:

 brew install openssl
 cd /usr/local/include 
 ln -s ../opt/openssl/include/openssl .

Это сработало для меня, пытаясь скомпилировать PHP 7.2.1 с phpbrew на Mac OS High Sierra - Спасибо!
Бруно де Оливейра

6

Приведенное выше решение от edwardthesecond сработало и для меня на Сьерре

 brew install openssl
 cd /usr/local/include 
 ln -s ../opt/openssl/include/openssl 
 ./configure && make

Другие шаги, которые я делал раньше, были:

  • установка openssl через brew

    brew install openssl
    
  • добавление openssl к пути, как это предлагает homebrew

    brew info openssl
    echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
    

Работал хорошо для меня, просто пропустил часть './configure && make'
Дэвид 'mArm' Ansermot

2

По умолчанию homebrew дал мне OpenSSL версии 1.1, а я искал версию 1.0. Это сработало для меня.

Чтобы установить версию 1.0:

brew install https://github.com/tebelorg/Tump/releases/download/v1.0.0/openssl.rb

Затем я попытался найти символическую ссылку, но это дало мне следующую ошибку:

ln -s /usr/local/Cellar/openssl/1.0.2t/include/openssl /usr/bin/openssl
ln: /usr/bin/openssl: Operation not permitted

Наконец связал openssl, чтобы он указывал на версию 1.0 с помощью команды brew switch:

brew switch openssl 1.0.2t
Cleaning /usr/local/Cellar/openssl/1.0.2t
Opt link created for /usr/local/Cellar/openssl/1.0.2t

1

Примечание: это больше не работает из-за https://github.com/Homebrew/brew/pull/612

У меня была такая же проблема сегодня. Я удалил (unbrewed ??) openssl 1.0.2 и установил 1.0.1 также с homebrew. Дотнет новый / восстановить / запустить потом работал нормально.

Установите openssl 101:
brew install homebrew / версии / openssl101. Ссылка
:
ссылка brew --force homebrew / версии / openssl101.


2
Это сделал это! Кажется, что 1.0.2 не хочет связываться. Следующий вопрос: почему .netcore предлагает что-то, что не рекомендуется в сообществе.
Дэвид Смерть

1.0.2 работал для меня на другом Mac несколько дней назад, так что, возможно, произошла недавняя смена brew или openssl. Во всяком случае, для дот нетто ядра, мы хороши :)
user3488820

1
Ссылка на github, опубликованная @bartonjs, показывает, что brew был обновлен всего несколько дней назад. Глядя на коммит, изменение заключается в том, что `if HOMEBREW_PREFIX.to_s ==" / usr / local "&& keg.name ==" openssl "`, поэтому я предполагаю, что версия 1.0.1 использует другой HOMEBREW_PREFIX.
Дэвид Смерть

11
у меня не работает, все равно выдает ошибкуRefusing to link: openssl101 Linking keg-only openssl101 means you may end up linking against the insecure, deprecated system OpenSSL while using the headers from Homebrew's openssl101. Instead, pass the full include/library paths to your compiler e.g.: -I/usr/local/opt/openssl101/include -L/usr/local/opt/openssl101/lib
dark_ruby

6
Этот ответ больше не является корректным, учитывая изменения, внесенные разработчиками homebrew по адресу github.com/Homebrew/brew/pull/612
Джошка

1

У меня была такая же проблема, когда попытка установить более новую версию ruby ​​2.6.5 https://github.com/kelaberetiv/TagUI/issues/86 помогает мне решить проблему. Это если для macOS каталина версия 10.15.1

В основном я сделал update and upgradehomebrew и установил openssl и установил ruby.

brew update && brew upgrade
brew install openssl

Затем создайте эти 2 символические ссылки

ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/

затем установил ruby ​​2.6.5


0

для меня это то, что сработало ...

Я отредактировал ./bash_profile и добавил команду ниже

экспорт PATH = "/ usr / local / opt / openssl / bin: $ PATH"


0
export https_proxy=http://127.0.0.1:1087 http_proxy=http://127.0.0.1:1087 all_proxy=socks5://127.0.0.1:1080

работает для меня

и я думаю, что это может решить все проблемы, такие как Failed to connect to raw.githubusercontent.com port 443: Connection refused

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.