使用Homebrew更新OS X上的OpenSSL

94

我正在使用MacOS X 10.7.5,由于握手失败,我需要更新OpenSSL版本。互联网上有几篇教程,我尝试了以下方法:

brew install openssl
brew link openssl --force

然而,它不起作用:
openssl version
OpenSSL 0.9.8r 8 Feb 2011

brew unlink openssl && brew link openssl --force
Unlinking /usr/local/Cellar/openssl/1.0.1e... 1139 links removed
Linking /usr/local/Cellar/openssl/1.0.1e... 1139 symlinks created

SVN问题仍未解决。有什么想法吗?我宁愿不尝试MacPorts方法,因为它可能会干扰Homebrew。

1
庆幸它没有起作用。版本0.9.8r没有受到HeartBleed漏洞的影响。如果您在2013年3月成功升级,那么您创建的任何SSL证书都已经被泄露,现在必须重新生成密钥。请参阅heartbleed.com以了解受影响的版本。 - Houman
3
这个问题似乎不适合在此讨论,因为它与编程或开发无关。请查看帮助中心中的“我可以在这里提哪些问题”页面。也许在超级用户或苹果 Stack Exchange 上提问会更合适。 - jww
2
@jww 这里是Stackoverflow,请让它变得有用。有些问题可能会有一些灰色区域。因为有些人在不理解开发者的情况下就投票关闭问题,所以我已停止提问。 - amar
11个回答

99

如果您正在使用Homebrew,/usr/local/bin应该已经位于$PATH的前面,或者至少在/usr/bin之前。如果您现在在终端窗口中运行brew link --force openssl,然后打开新的终端窗口并在其中运行which openssl,它现在应该在/usr/local/bin下显示openssl


2
我已经安装了1.0.2h_1,但是我仍然处于完全相同的情况,而openssl version -a仍然显示OpenSSL 0.9.8zg 14 July 2015。有什么建议吗? - Peyman Mohamadpour
86
这个命令无法执行,因为 brew link --force openssl 警告:拒绝链接:openssl 连接只有在安装了keg-only版本的openssl时才可以进行,这样做可能会链接到不安全、已弃用的系统OpenSSL,并在使用Homebrew的openssl头文件时出现问题。 相反,传递完整的包含/库路径给编译器,例如: -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib - Timo
6
你能解决这个问题吗?我也遇到了同样的问题,但似乎找不到任何解决办法。 - Tuhina Singh
3
我不确定这是否是“好的做法”或者是否安全,但您可以将/usr/local/bin链接到/usr/local/opt/openssl/bin/openssl,使用以下命令: ln -s /usr/local/opt/openssl/bin/openssl /usr/local/bin/openssl。请注意:我不能保证这是一种安全或正确的操作方式。 - brunodd
2
有关此问题的更多信息:https://dev59.com/XFkT5IYBdhLWcg3wZele - ekkis
显示剩余5条评论

16

使用brew在Mac上安装了openssl,但在其他brew安装二进制文件所在的/usr/local/bin目录中找不到任何内容。我在这里发现了我的新openssl:

/usr/local/opt/openssl/bin/openssl

可以像这样运行它:

/usr/local/opt/openssl/bin/openssl version

我不想更新OS X openssl,因为某些系统文件或其他第三方应用程序可能依赖于旧版本。

我也不介意比openssl更长的路径。

为了所有正在寻找由brew安装的openssl位置的用户而写的内容。


15
在终端中运行:

export PATH=/usr/local/bin:$PATH
brew link --force openssl

如果你收到警告:brew unlink openssl,你可能需要先取消链接openssl。

这可以确保我们为这种情况链接正确的openssl。(并且不会干扰.profile文件)

感谢@Olaf的回答和@Felipe的评论。一些人 - 比如我自己 - 可能有一些非常混乱的PATH变量。


10
它只是说“拒绝链接:openssl”。 - rogerdpack

7
我曾经遇到过这个问题,发现新版本的openssl已经安装成功,但我的PATH设置不正确——我的$PATH将端口路径放在brew路径之前,所以它总是找到旧版本的openssl
对我来说解决方法是将brew的路径(/usr/local/bin)放在$PATH的最前面。
要查找正在加载openssl的位置,请运行which openssl并注意输出。这将是您运行openssl时系统使用的版本的位置。它将在除"/usr/local/bin"之外的其他位置。更改您的$PATH,关闭该终端选项卡并打开一个新的选项卡,然后运行which openssl。现在你应该看到另一个路径,可能在/usr/local/bin下。现在运行openssl version,你应该看到你安装的新版本"OpenSSL 1.0.1e 11 Feb 2013"。

5
为了回答你关于更新openssl的问题,我按照以下步骤成功地将我的Mac上的openssl版本更新到最新的openssl版本1.0.1e。
我按照这里找到的步骤:http://foodpicky.com/?p=99 当你到达终端命令的步骤时,请确保使用sudo make和sudo make install(我必须再做一遍步骤,因为我没有使用sudo进行更新)。
希望这可以帮助到你。

3
从今天开始,已知1.0.1e版本(具体为1.0.1a-f)存在严重安全漏洞。未来读者,请确保升级至至少1.0.1g版本。http://heartbleed.com/ - SapphireSun
旧版本仍然显示在我的电脑上:http://stackoverflow.com/questions/22974590/brew-link-force-openssl-did-not-update-openssl-version - quantumpotato
2
“减一”:“……确保使用sudo make……”-您不需要使用特权进行make。您只需执行make,然后如果需要,执行sudo make install。您还引用了一个可怕的参考文献。它将更新的1.0.x版本的OpenSSL替换了Apple的/usr中的0.9.8版本。这是非常糟糕的事情,因为没有二进制兼容性。 - jww

3

我在本地服务器上安装一些 Wordpress 插件时遇到了问题,我的服务器运行的是 OSX10.11 上的 php56 版本,这些插件在 SSL 外部 API 上连接失败。

安装 openSSL 无法解决我的问题。但是我发现需要重新安装 CURL 才能解决问题。

使用 Homebrew 安装 CURL 解决了我的问题。

brew rm curl && brew install curl --with-openssl

brew uninstall php56 && brew install php56 --with-homebrew-curl --with-openssl

2
在mac OS X Yosemite上,使用brew安装后,它被放置在/usr/local/opt/openssl/bin/openssl目录下。 但当尝试链接时,会一直出现“Linking keg-only openssl means you may end up linking against the insecure”错误提示。 因此,我只需要提供完整的路径来链接它。
ln -s /usr/local/opt/openssl/bin/openssl /usr/local/bin/openssl

现在,当我执行以下命令:

$ openssl version -a

它将显示 OpenSSL 1.0.2o 版本。

所以我猜它已经生效了!


0

对于那些使用 macOS Monterey 并通过 brew 安装最新的 openssl v3 的人来说,它位于完全不同的路径中:

/opt/homebrew/Cellar/openssl@3/

特定版本已安装在子文件夹中,二进制文件可在以下位置找到(例如 v.3.0.7):

/opt/homebrew/Cellar/openssl@3/3.0.7/bin/openssl

使用brew link --force openssl仍然有效来创建符号链接。尽管它创建了符号链接,但系统中安装的openssl位于/usr/bin/openssl,并且由于它在$PATH列表中位于较早位置,所以具有优先级。 因此解决方案是设置本地符号链接:

ln -s /opt/homebrew/Cellar/openssl@3/3.0.7/bin/openssl /usr/local/bin/openssl

这样做可以在不同的路径下保存两个版本,但是当在$PATH中搜索时,/usr/local/bin具有最高优先级。 缺点是,由于每个版本现在位于单独的子文件夹中,因此您需要在使用brew更新新版本时更新符号链接。


0

尝试:

mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

然后尝试:

brew install homebrew/portable-ruby/portable-openssl

0
在OSX Big Sur上,我遇到了非常沮喪的錯誤體驗,因為所有解決方法都依賴於使用`brew install`。但是運行`brew install`總是返回類似以下的錯誤:
Error: 
  homebrew-core is a shallow clone.
To `brew update`, first run:
  git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
This command may take a few minutes to run due to the large size of the repository.
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you
automatically to avoid repeatedly performing an expensive unshallow operation in
CI systems (which should instead be fixed to not use shallow clones). Sorry for
the inconvenience!

但是我无法运行该命令,因为git出现了错误:

% git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/libexec/git-core/git-remote-https
  Reason: image not found

最终的解决方案是重新安装git。
brew reinstall git

然后根据需要更新符号链接:

brew link --overwrite git

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接