Homebrew 拒绝链接 OpenSSL

Posted

技术标签:

【中文标题】Homebrew 拒绝链接 OpenSSL【英文标题】:Homebrew refusing to link OpenSSL 【发布时间】:2016-12-04 20:21:52 【问题描述】:

我正在使用:OSX 10.11.6,Homebrew 版本 0.9.9m OpenSSL 0.9.8zg 2015 年 7 月 14 日

我正在尝试使用 dotnetcore 并关注他们的instructions,

我已经升级/安装了最新版本的 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

包含编译器标志的选项对我来说没有意义,因为我没有编译我所依赖的这些库。

EDIT 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/

【问题讨论】:

对于 .NET Core,您需要受支持的 OpenSSL 版本,即 1.0.1 或 1.0.2 版本。既然您要报告 0.9.8 版本,也许您需要先brew upgrade openssl 我已经这样做了。我应该澄清一下,但我没有将这些步骤添加到问题中。但我已经完成了brew updatebrew install openssl。这是尝试安装支持的版本。 Homebrew 似乎已明确阻止它:github.com/Homebrew/brew/commit/…。 而且.. 继续完善我的闲聊,您可能会对 github.com/Homebrew/brew/pull/597 上的任何发展感兴趣 "...当我尝试链接 openssl 时,我继续遇到此链接错误:.." - 另请参阅 How to set the runtime path (-rpath) of an executable with gcc under Mac OSX?。如果 Brew 没有添加它,它可能会帮助您始终在运行时加载正确的库。 【参考方案1】:

注意:由于https://github.com/Homebrew/brew/pull/612,这不再有效

我今天也遇到了同样的问题。我卸载(unbrewed??)openssl 1.0.2 并安装了 1.0.1 和 homebrew。 dotnet new/restore/run 然后工作正常。

安装openssl 101: brew install homebrew/versions/openssl101 链接: brew link --force homebrew/versions/openssl101

【讨论】:

做到了!似乎 1.0.2 不想链接。下一个问题是为什么 .netcore 会提出社区不推荐的内容。 1.0.2 几天前在另一台 Mac 上为我工作,所以最近可能有 brew 或 openssl 更改。无论如何,对于dot net core,我们很好:) @bartonjs 发布的 github 链接显示 brew 是在几天前更新的。查看提交,更改是 `if HOMEBREW_PREFIX.to_s == "/usr/local" && keg.name == "openssl"` 所以我猜测 1.0.1 版本使用不同的 HOMEBREW_PREFIX。 对我不起作用,仍然报错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 鉴于自制程序开发人员在github.com/Homebrew/brew/pull/612 所做的更改,此答案不再正确【参考方案2】:

正如另一个答案的更新所暗示的,安装旧的 openssl101 brew 的解决方法将不再有效。如需立即解决方法,请参阅this comment on 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 如何找到正确的库。

同样重要的是,微软似乎已经意识到了这个问题,并且有 a) 一个有点直接的计划来缓解以及 b) 一个长期的解决方案(可能将 OpenSSL 与 dotnet 捆绑在一起)。

另外需要注意的是:/usr/local/opt/openssl/lib 是默认链接 brew 的位置:

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 的路径。

更新 System.Security.Cryptography.Native.dylib 库的 rpath 后,您需要重新启动交互式会话(即关闭控制台并启动另一个)。

【讨论】:

我应该在哪里添加该行?我正试图让它在 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之前添加了这一行。将重试并返回。 为我工作,在我的情况下,sdk 安装到不同的目录,所以我不得不更改路径。 使用 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【参考方案3】:

这些解决方案都不适用于 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

解压并放入:

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

【讨论】:

如果您尝试在 OS X 上安装 .NET 核心,您应该将其包装在 Docker 中。 完成这一切之后:OpenSSL 0.9.8zh 14 Jan 2016 构建于:2016 年 5 月 15 日平台:darwin64-x86_64-llvm 以以下方式创建符号链接对我有用: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)。 我按照这些说明进行操作,但是当我输入 which openssl 时,我得到 (/opt/local/bin/openssl)。如何让它成为 /usr/local/bin/openssl? 我按照这些说明进行操作(非常感谢您的逐步指导),但它仍然显示 0.9.8。感谢 Olivier 提供的替代链接方法。【参考方案4】:

在尝试了所有我能找到的东西但没有任何效果之后,我只是尝试了这个:

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

【讨论】:

这是一个非常简单的解决方案,我非常希望它对我有用,但在这里没有运气。即使更新了我的 PATH 并重新启动了我的 shell 会话 which openssl 仍然指向 /usr/bin/openssl 为了让它工作,我还必须编辑我的 .bash_profile。但唯一有效的是告诉它查看 /usr/local/bin 而不是 /usr/bin。我通过添加 export PATH=/usr/local/bin:$PATH 来做到这一点 为此,您需要在 PATH 的 front 的末尾添加/usr/local/opt/openssl/bin没有 /openssl 在末尾,而不是结束:PATH=/usr/local/opt/openssl/bin:$PATH 使用 /usr/local/opt/openssl 而不是 /usr/local/Cellar/openssl/$version 意味着您将自动在 $PATH 中保留最新版本,而无需在每次升级时都进行更改。 经过几个小时的愚蠢之后,这对我来说是个窍门以及@MarkReed 的附加说明 我能够使用它并让它为我工作。谢谢你。我有 1.0.2q 版本的 openssl。【参考方案5】:

这对我有用:

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

注意:我只将其用作临时修复,直到我可以花时间从头开始再次正确安装 Openssl。我记得我花了一天的大部分时间进行调试并遇到问题,然后才意识到最好的方法是手动安装我需要的证书。在尝试此操作之前,请阅读@bouke 评论中的链接。

【讨论】:

是最后一个链接的完整路径/usr/local/bin/openssl? 为什么这个答案不被接受,你救了我的命。 ::竖起大拇指:: brew 拒绝这样做是有充分理由的。另请参阅:github.com/Homebrew/brew/pull/597. 此解决方案对我有用,但由于版本差异,我不得不将 1.0.2j 更改为 1.0.2k。所以用户请注意,您可能需要为当前版本调整路径 我看到@Jeff 的评论有点太晚了。如果你也这样做了,我相信ln -s -f /usr/local/Cellar/openssl/1.0.2k/bin/openssl /usr/local/bin/openssl 会解决它【参考方案6】:

我也有类似的情况。我需要通过brew安装openssl,然后使用pip安装mitmproxy。我从brew link --force 收到同样的投诉。以下是我达到的解决方案:(没有通过 brew 强制链接)

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 库,我会留下单线。

注意:/usr/local/opt/openssl/lib路径是由brew info openssl获取的

【讨论】:

发现这个对安装 pysqlcipher 很有用 对于安装cryptography很有用。我错过了PKG_CONFIG_PATH 变量【参考方案7】:

只需执行brew info openssl并阅读其中显示的信息:

如果您需要首先在 PATH 中运行此软件:echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.bash_profile

【讨论】:

brew info openssl 为我提供了同样有用的信息。运行上面建议的命令,然后运行source ~/.bash_profile 或打开一个新终端为我解决了它。 终于。这也对我有用。上面的其他答案没有! echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc【参考方案8】:

这对我有用:

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

【讨论】:

这对我有用,尝试在 Mac OS High Sierra 上使用 phpbrew 编译 PHP 7.2.1 - 谢谢!【参考方案9】:

edwardthesecond 的上述解决方案在 Sierra 上也对我有用

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

我之前做过的其他步骤是:

通过 brew 安装 openssl

brew install openssl

按照 homebrew 的建议将 openssl 添加到路径中

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

【讨论】:

对我来说很好,只是跳过了 la part './configure && make'【参考方案10】:

如果迁移你的 mac 会破坏自制软件:

我迁移了我的 mac,它取消了 所有 我的 homebrew 安装 - 包括 OpenSSL。这打破了gem install,这是我第一次注意到这个问题并开始尝试修复它。

经过一百万个解决方案(迁移到 OSX Sierra - 10.12.5 时),解决方案最终变得非常简单:

brew reinstall ruby
brew reinstall openssl

稍后再编辑:正如 Gal Bracha 在 cmets 中指出的那样,你可能吗?为了安全起见,需要在重新安装之前删除/usr/local/opt/openssl。我当时不需要,但如果您仍然遇到问题,请尝试一下。

【讨论】:

一年后,这发生在我迁移我的 Mac 上,你的修复也对我有用。非常感谢;我开始考虑擦除我的新 Mac 并重新安装并重新手动设置所有内容。 @David 很高兴我能阻止你越界!我几乎也是这样做的。 在执行上述操作之前,您可能还需要删除此文件夹。 rm -rf /usr/local/opt/openssl 如果你在我身边,我会亲你。经过 3 小时的努力,这对我有用。【参考方案11】:

对我来说,这是有效的......

我编辑了 ./bash_profile 并在下面添加了命令

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

【讨论】:

【参考方案12】:

我在尝试安装较新版本的 ruby​​ 2.6.5 时遇到了同样的问题 https://github.com/kelaberetiv/TagUI/issues/86 帮助我解决问题。这适用于 macOS catalina 版本 10.15.1

基本上,我做了update and upgrade homebrew 并安装了 openssl 并安装了 ruby​​。

brew update && brew upgrade
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/

然后安装 ruby​​ 2.6.5

【讨论】:

【参考方案13】:
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

【讨论】:

【参考方案14】:

默认情况下,自制软件给了我 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

最后使用 brew switch 命令将 openssl 链接到 1.0 版本:

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

【讨论】:

禁止从任意 URL 调用非校验和下载 openssl 公式文件!【参考方案15】:

解决方案可能是更新一些工具。

这是我从 2020 年开始使用 Ruby 和 Python 的情景:

我需要在 Mac 上安装 Python 3 并且事情升级了。最后,更新 homebrew、node 和 python 导致 openssl 出现问题。我没有 openssl 1.0,所以我不能“brew switch”到它。 那么什么还在尝试使用旧的 1.0 版本?

它调整为 Ruby 2.5.5。 所以我只是安装了 Ruby 2.5.8 并删除了旧版本。

如果这还不够,您可以尝试其他方法:使用 rbenv 和 pyenv。清理宝石和公式。更新自制软件、节点、纱线。升级捆绑器。确保根据每个工具的说明设置您的 .bash_profile(或等效文件)。重新打开终端。

【讨论】:

以上是关于Homebrew 拒绝链接 OpenSSL的主要内容,如果未能解决你的问题,请参考以下文章

Homebrew:无法符号链接,/usr/local/bin 不可写[关闭]

MacOS homebrew mysql root密码

sh 重新链接每个Homebrew安装包

OpenCV 3.0 的 Homebrew 安装未链接到 Python

使用 gcc 链接到使用 Homebrew 安装的动态库?

自 Mojave 以来,链接在 homebrew 的 cmake 中不起作用