自制程序拒绝链接OpenSSL


140

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

我正在尝试使用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

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

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/

3
对于.NET Core,您需要受支持的OpenSSL版本,该版本应为1.0.1或1.0.2。由于您要报告的是0.9.8版本,因此您可能需要brew upgrade openssl首先?
bartonjs '16

2
我已经做到了。我应该澄清一下,但是我没有在问题中添加这些步骤。但是我已经完成了brew updatebrew install openssl。这正在尝试安装支持的版本。
daviddeath '16

2
看来Homebrew已明确阻止了它:github.com/Homebrew/brew/commit/…
bartonjs '16

4
为了继续解决我的问题,您可能会对github.com/Homebrew/brew/pull/597上的
bartonjs

2
“ ...当我尝试链接openssl时,我继续遇到此链接错误:..” -另请参阅如何在Mac OSX下使用gcc设置可执行文件的运行时路径(-rpath)?。如果Brew未添加正确的库,它可能会帮助您始终在运行时加载正确的库。
jww '16

Answers:


63

正如对其他答案的更新所暗示的那样,安装旧的openssl101 brew的解决方法将不再起作用。有关当前的解决方法,请参见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似乎已经意识到了这一问题,并且都具有以下两个方面: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 libray的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它来查找。
Ben Collins

哦,刚意识到我要在安装前添加此行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

59

这对我有用:

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注释中的链接。


9
最后链接的完整路径是/usr/local/bin/openssl什么?
Mohamed Hafez

为什么这个答案不被接受,你救了我的命男。::竖起大拇指::
wukong 2016年

2
Brew拒绝这样做是有充分理由的。另请参见:github.com/Homebrew/brew/pull/597
Bouke

7
该解决方案对我有用,但是由于版本差异,我不得不更改1.0.2j1.0.2k。因此用户要注意,您可能需要调整当前版本的路径
Jeff

我看到@Jeff的评论有点太晚了。如果您也这样做,我相信会ln -s -f /usr/local/Cellar/openssl/1.0.2k/bin/openssl /usr/local/bin/openssl解决
shaneparsons '17

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

现在,将Symlink 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 core,则应将其包装在Docker中。
mcgwier

6
完成所有这些操作后:OpenSSL 0.9.8zh 2016年1月14日建立于:2016年5月15日平台: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。感谢Olivier提供的替代链接方法。
Onikoroshi

44

只需执行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 '17

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并重新安装并手动重新设置所有内容。
戴维

@David很高兴我可以阻止您走到边缘!我几乎一样。
tobybot

1
执行上述操作之前,您可能还需要删除此文件夹。rm -rf /usr/local/opt/openssl
Gal Bracha

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并重新启动我的Shell会话之后,which openssl仍然指向/usr/bin/openssl
Will Hitchcock

为了使此工作正常进行,我还必须编辑.bash_profile。但是唯一有效的方法是告诉它在/ usr / local / bin中查找,而不是在/ usr / bin中查找。我是通过添加export PATH=/usr/local/bin:$PATH
Alison

3
对于这个工作,你需要添加/usr/local/opt/openssl/bin没有/openssl上月底,到了正面的路径,而不是最终的: PATH=/usr/local/opt/openssl/bin:$PATH 使用/usr/local/opt/openssl的,而不是/usr/local/Cellar/openssl/$version意味着你将自动保留最先进的最新版本在你的$ PATH,而无需在每次升级时进行更改。
马克·里德

经过数小时的笨拙,这与@MarkReed的其他注释一起为我带来了成功
Naomi请参阅

我能够使用它并使它为我工作。谢谢。我有1.0.2q版本的openssl。
Karthik NG,

8

我有一个类似的情况。我需要通过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 lib,我将保留单线。

注意: /usr/local/opt/openssl/lib路径是通过brew info openssl


发现这对安装pysqlcipher非常有用
drtf

对于安装很有用cryptography。我缺少PKG_CONFIG_PATH变量
Sagar

7

这对我有用:

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

这对我有用,试图在Mac OS High Sierra上使用phpbrew编译PHP 7.2.1-谢谢!
布鲁诺·德·奥利维拉

6

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

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

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

  • 通过brew安装openssl

    brew install openssl
    
  • 按照家酿的建议将openssl添加到路径

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

漂亮的工作对我来说,只是跳过LA一部分“的./configure &&使”
大卫MARM“Ansermot

1

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

我今天有同样的问题。我卸载了(unbrewed ??)openssl 1.0.2,并同时使用自制软件安装了1.0.1。然后新建/还原/运行Dotnet即可。

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


2
做到了!似乎1.0.2不想链接。下一个问题是.netcore为什么会建议社区中不推荐的内容。
daviddeath '16

几天前,1.0.2在另一台Mac上为我工作,所以也许是最近的brew或openssl更改。无论如何,对于点网核心,我们很好:)
user3488820

1
@bartonjs发布的github链接显示brew是几天前更新的。查看提交,更改为`if HOMEBREW_PREFIX.to_s ==“ / usr / local” && keg.name ==“ openssl”`,因此我猜测1.0.1版本使用了另一个HOMEBREW_PREFIX。
daviddeath '16

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 16'Jul 31'20

6
这个答案是不再正确鉴于自制开发者在作出改变github.com/Homebrew/brew/pull/612
Joshka

1

尝试安装较新版本的ruby 2.6.5时遇到了相同的问题 https://github.com/kelaberetiv/TagUI/issues/86帮助我解决了这个问题。如果是macOS catalina版本10.15.1

基本上,我做update and upgrade自制程序并安装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


1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.