Homebrew refuse de lier OpenSSL

141

Je suis sur: OSX 10.11.6, Homebrew version 0.9.9m OpenSSL 0.9.8zg 14 juillet 2015

J'essaye de jouer avec dotnetcore et en suivant leurs instructions ,

J'ai mis à jour / installé la dernière version d'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

Mais lorsque j'essaie de lier openssl, je continue à rencontrer cette erreur de liaison:

> 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

L'option d'inclure des indicateurs de compilateur n'a pas de sens pour moi, car je ne compile pas ces bibliothèques dont je suis dépendant.

EDIT dotnetcore a mis à jour ses instructions:

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/
Daviddeath
la source
3
Pour .NET Core, vous avez besoin d'une version prise en charge d'OpenSSL, qui serait une version 1.0.1 ou 1.0.2. Puisque vous signalez une version 0.9.8, vous devez peut-être d' brew upgrade opensslabord le faire?
bartonjs
2
J'ai déjà fait ça. J'aurais dû clarifier, mais je n'ai pas ajouté ces étapes à la question. Mais j'ai déjà fait le brew updateet brew install openssl. Ceci tente d'installer la version prise en charge.
daviddeath
2
On dirait que Homebrew l'a explicitement bloqué: github.com/Homebrew/brew/commit/… .
bartonjs
4
Et .. pour continuer à compléter ma randonnée, vous pourriez être intéressé par tout ce qui se développe sur github.com/Homebrew/brew/pull/597
bartonjs
2
"... quand j'essaye de lier openssl je continue à rencontrer cette erreur de liaison: .." - Voir aussi Comment définir le chemin d'exécution (-rpath) d'un exécutable avec gcc sous Mac OSX? . Cela peut vous aider à toujours charger la bibliothèque correcte au moment de l'exécution, si Brew ne l'ajoute pas.
jww

Réponses:

63

Comme le suggère la mise à jour de l'autre réponse, la solution de contournement de l'installation de l'ancien brew openssl101 ne fonctionnera plus. Pour une solution de contournement immédiate, consultez ce commentaire sur dotnet / cli # 3964 .

La partie la plus pertinente du problème copiée ici:

J'ai regardé dans l'autre option qui a été suggérée pour définir le rpath sur la bibliothèque. Je pense que ce qui suit est une meilleure solution qui n'affectera que cette bibliothèque spécifique.

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

et / ou si vous avez installé NETCore 1.0.1, exécutez également la même commande pour 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

En effet, plutôt que de dire au système d'exploitation de toujours utiliser la version homebrew de SSL et de provoquer potentiellement une rupture de quelque chose, nous disons à dotnet comment trouver la bonne bibliothèque.

De plus, il semble que Microsoft soit conscient du problème et ait à la fois a) un plan quelque peu immédiat pour atténuer ainsi que b) une solution à long terme (probaby regroupant OpenSSL avec dotnet).

Une autre chose à noter: /usr/local/opt/openssl/libc'est là que l'infusion est liée par défaut:

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

Si pour une raison quelconque vous installez le brew et le liez dans un emplacement différent, alors ce chemin est celui que vous devez utiliser comme rpath.

Une fois que vous avez mis à jour le rpath de la bibliothèque System.Security.Cryptography.Native.dylib, vous devrez redémarrer votre session interactive (c'est-à-dire fermer votre console et en démarrer une autre).

Ben Collins
la source
Où suis-je censé ajouter cette ligne? J'essaie de faire fonctionner cela dans CI. Je reçois un /usr/local/share/dotnet/shared/Microsoft.NETCore.App/1.0.0/System.Security.Cryptography.Native.dylib (No such file or directory).
mrahhal
@mrahhal c'est le chemin d'installation de l' dotnetoutillage. Il est possible que vous ne l'ayez pas installé ou que vous l'ayez installé ou à un autre emplacement. S'il est installé et de votre part, vous pouvez l'utiliser which dotnetpour le trouver.
Ben Collins
Oh, je viens de réaliser que j'ajoute cette ligne avant l'installation dotnet. Je vais réessayer et revenir.
mrahhal
3
Cela a fonctionné pour moi, dans mon cas, le sdk a été installé dans un répertoire différent, j'ai donc dû changer le chemin.
mrahhal
4
Avec dotnet 1.1.0 je devais faire: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

C'est ce qui a fonctionné pour moi:

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

Merci à @dorlandode sur ce fil https://github.com/Homebrew/brew/pull/597

NB: Je n'ai utilisé cela que comme solution temporaire jusqu'à ce que je puisse passer du temps à réinstaller correctement Openssl à partir de zéro. Si je me souviens bien, j'ai passé la meilleure partie de la journée à déboguer et à avoir des problèmes avant de réaliser que le meilleur moyen était d'installer manuellement les certificats dont j'avais besoin un par un. Veuillez lire le lien dans le commentaire de @ bouke avant d'essayer.

rorykoehler
la source
9
est le chemin complet du dernier lien /usr/local/bin/openssl?
Mohamed Hafez
Pourquoi cette réponse n'est pas acceptée, vous m'avez sauvé la vie. :: thumb up ::
wukong
2
Il y a une bonne raison pour laquelle Brew refuse de faire cela. Voir aussi ceci: github.com/Homebrew/brew/pull/597 .
Bouke
7
Cette solution a fonctionné pour moi, mais j'ai dû changer 1.0.2jen 1.0.2kraison des différences de version. Alors les utilisateurs, méfiez-vous, vous devrez peut-être ajuster les chemins pour la version actuelle
Jeff
J'ai vu le commentaire de @ Jeff un peu trop tard. Si vous l'avez fait aussi, je crois que ln -s -f /usr/local/Cellar/openssl/1.0.2k/bin/openssl /usr/local/bin/opensslça résout le problème
shaneparsons
49

Aucune de ces solutions n'a fonctionné pour moi sur OS X El Capitan 10.11.6. Probablement parce qu'OS X a une version native de openssl qu'il croit supérieure et, en tant que telle, n'aime pas la falsification.

Alors, j'ai pris la grande route et j'ai recommencé à zéro ...


Installer manuellement et lien symbolique

cd /usr/local/src  
  • Si vous obtenez "No such file or directory", faites-le:

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

Téléchargez openssl:

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

Extrait et cd dans:

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

Compilez et installez:

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

Maintenant, créez un lien symbolique entre le fichier openssl d'OS X et votre opensl nouveau et mis à jour:

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

Fermez le terminal, ouvrez une nouvelle session et vérifiez qu'OS X utilise votre nouveau openssl:

openssl version -a
mcgwier
la source
Si vous essayez d'installer .NET Core sur OS X, vous devez l'envelopper dans Docker.
mcgwier
6
Après avoir fait tout cela: OpenSSL 0.9.8zh 14 janvier 2016 construit sur: 15 mai 2016 plate-forme: darwin64-x86_64-llvm
AsimRazaKhan
5
Création d' un lien symbolique de la manière suivante a fonctionné pour moi: ln -s /usr/local/openssl-1.0.2h/bin/openssl /usr/local/bin/openssl. Après avoir redémarré votre session Terminal, tapez which opensslpour vous assurer que vous utilisez la version 1.0.2 mise à jour ( /usr/local/bin/openssl) au lieu de celle intégrée ( /usr/bin/openssl).
Olivier
1
J'ai suivi ces instructions, mais quand je tape quel openssl, j'obtiens (/ opt / local / bin / openssl). Comment puis-je obtenir que ce soit / usr / local / bin / openssl?
Chris
2
J'ai suivi ces instructions (merci beaucoup pour l'étape par étape), et il a quand même dit 0.9.8. Merci à Olivier pour la méthode de liaison alternative qui a fonctionné.
Onikoroshi
45

Exécutez brew info opensslet lisez simplement les informations là où il est dit:

Si vous devez avoir ce logiciel en premier dans votre exécution PATH: echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

Alex Maiburg
la source
3
brew info openssla donné les mêmes informations utiles pour moi. L'exécution de la commande suggérée ci-dessus, puis l'exécution source ~/.bash_profileou l'ouverture d'un nouveau terminal l'ont résolu pour moi.
PanPipes
2
ENFIN. Cela a également fonctionné pour moi. Les autres réponses ci-dessus ne l'ont pas fait!
user124384
2
ouecho 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
B.Ma
16

Si la migration de votre Mac casse l'homebrew:

J'ai migré mon mac et il a dissocié toutes mes installations homebrew, y compris OpenSSL. Cela s'est cassé gem install, c'est ainsi que j'ai remarqué le problème pour la première fois et j'ai commencé à essayer de le réparer.

Après un million de solutions (lors de la migration vers OSX Sierra - 10.12.5), la solution a fini par être comiquement simple:

brew reinstall ruby
brew reinstall openssl
tobybot
la source
Et un an plus tard, cela m'est arrivé lors de la migration de mon Mac, et votre correctif a également fonctionné pour moi. Merci beaucoup; J'en arrivais au point d'envisager d'effacer mon nouveau Mac et de faire une nouvelle installation et de tout configurer à nouveau manuellement.
David
@David heureux de pouvoir vous empêcher de franchir le seuil! J'ai presque fait la même chose.
tobybot
1
Vous devrez peut-être également supprimer ce dossier avant de faire ce qui précède. rm -rf /usr/local/opt/openssl
Gal Bracha
9

Après avoir essayé tout ce que j'ai pu trouver et rien n'a fonctionné, j'ai juste essayé ceci:

touch ~/.bash_profile; open ~/.bash_profile

À l'intérieur du fichier ajouté cette ligne.

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

maintenant ça marche :)

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
Jorn
la source
1
C'est une solution vraiment simple et j'avais bon espoir que cela fonctionnerait pour moi, mais pas de chance ici. Même après la mise à jour de mon PATH et le redémarrage de ma session shell which opensslpointe toujours vers/usr/bin/openssl
Will Hitchcock
Pour que cela fonctionne, j'ai également dû modifier mon .bash_profile. Mais la seule chose qui fonctionnait était de lui dire de chercher dans / usr / local / bin au lieu de / usr / bin. Je l'ai fait en ajoutantexport PATH=/usr/local/bin:$PATH
Alison
3
Pour que cela fonctionne, vous devez ajouter /usr/local/opt/openssl/bin, sans le /opensslsur la fin, à l' avant du chemin, pas la fin: PATH=/usr/local/opt/openssl/bin:$PATH Utiliser au /usr/local/opt/openssllieu de /usr/local/Cellar/openssl/$versionmoyens vous garderez automatiquement la version la plus à jour dans votre PATH $ sans avoir pour le changer à chaque mise à niveau.
Mark Reed
Après des heures de bêtises, cela a fait l'affaire pour moi avec les notes supplémentaires de @ MarkReed
Naomi Voir le
J'ai pu l'utiliser et le faire fonctionner pour moi. Je vous remercie. J'ai la version 1.0.2q de openssl.
Karthik NG
8

J'ai un cas similaire. Je dois installer openssl via brew, puis utiliser pip pour installer mitmproxy. Je reçois la même plainte de brew link --force. Voici la solution que j'ai atteinte: (sans liaison forcée par infusion)

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

Cela ne répond pas directement à la question. Je laisse le one-liner au cas où quelqu'un utiliserait pip et aurait besoin de la bibliothèque openssl.

Remarque: les /usr/local/opt/openssl/libchemins sont obtenus parbrew info openssl

Pili Hu
la source
J'ai trouvé celui-ci utile pour installer pysqlcipher
drtf
Utile pour l'installation cryptography. Il me manquait la PKG_CONFIG_PATHvariable
Sagar
7

Cela a fonctionné pour moi:

 brew install openssl
 cd /usr/local/include 
 ln -s ../opt/openssl/include/openssl .
edwardtheseconde
la source
Cela a fonctionné pour moi, en essayant de compiler PHP 7.2.1 avec phpbrew sur Mac OS High Sierra - Merci!
Bruno de Oliveira
6

La solution ci-dessus d'edwardthesecond a fonctionné pour moi aussi sur Sierra

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

Les autres étapes que j'ai faites auparavant étaient:

  • installation de openssl via brew

    brew install openssl
    
  • ajouter openssl au chemin comme suggéré par homebrew

    brew info openssl
    echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile
    
Lili
la source
A bien fonctionné pour moi, je viens de sauter la partie './configure && make'
David 'mArm' Ansermot
2

Par défaut, homebrew m'a donné la version 1.1 d'OpenSSL et je cherchais plutôt la version 1.0. Cela a fonctionné pour moi.

Pour installer la version 1.0:

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

Ensuite, j'ai essayé de créer un lien symbolique pour le parcourir, mais cela m'a donné l'erreur suivante:

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

Enfin lié openssl pour pointer vers la version 1.0 à l'aide de la commande 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
Mayank
la source
1

Remarque: cela ne fonctionne plus en raison de https://github.com/Homebrew/brew/pull/612

J'ai eu le même problème aujourd'hui. J'ai désinstallé (unbrewed ??) openssl 1.0.2 et installé 1.0.1 également avec homebrew. Dotnet new / restore / run a ensuite bien fonctionné.

Installer openssl 101:
brew install homebrew / versions / openssl101
Liaison:
lien brew --force homebrew / versions / openssl101

user3488820
la source
2
Cela l'a fait! Il semble que la version 1.0.2 ne voulait pas établir de lien. La question suivante est de savoir pourquoi .netcore suggère quelque chose qui n'est pas recommandé dans la communauté.
daviddeath
1.0.2 a fonctionné pour moi sur un autre mac il y a quelques jours, alors peut-être qu'il y a eu un récent changement de bière ou d'openssl. Quoi qu'il en soit, pour dot net core, nous sommes bons :)
user3488820
1
Le lien github publié par @bartonjs montre que brew a été mis à jour il y a quelques jours à peine. En regardant le commit, le changement est `if HOMEBREW_PREFIX.to_s ==" / usr / local "&& keg.name ==" openssl "` donc je suppose que la version 1.0.1 utilise un HOMEBREW_PREFIX différent.
daviddeath
11
n'a pas fonctionné pour moi, donne toujours une erreurRefusing 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
Cette réponse n'est plus correcte étant donné le changement effectué par les développeurs homebrew sur github.com/Homebrew/brew/pull/612
Joshka
1

J'ai eu le même problème en essayant d'installer une version plus récente de ruby ​​2.6.5 https://github.com/kelaberetiv/TagUI/issues/86 m'aide à résoudre le problème. Ceci si pour macOS Catalina Version 10.15.1

En gros, j'ai fait de l' update and upgradehomebrew , j'ai installé openssl et j'ai installé ruby.

brew update && brew upgrade
brew install openssl

Créez ensuite ces 2 liens symboliques

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/

puis installé ruby ​​2.6.5

gsumk
la source
0

pour moi, c'est ce qui a fonctionné ...

J'ai édité le ./bash_profile et ajouté la commande ci-dessous

export PATH = "/ usr / local / opt / openssl / bin: $ PATH"

développeur
la source
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

travaille pour moi

et je pense que cela peut résoudre tous les problèmes comme Failed to connect to raw.githubusercontent.com port 443: Connection refused

John Jim
la source