如何在OS X中升级OpenSSL?


126

如今,令人讨厌的 OpenSSL漏洞在野外大肆宣布,它使攻击者可以秘密检测和窃取私有服务器密钥(允许它们进入MitM并解密您的加密数据并窃取密码)。这会影响OpenSSL版本,包括1.0.1f,这是我最新的Mavericks计算机 Mac上的版本(因为我使用端口/酿造安装了其他软件,这些软件在没有意识到的情况下更新了我的openssl):

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014

这表明我没有使用Mavericks版本的OpenSSL:

$ which openssl
/opt/local/bin/openssl

OpenSSL今天在1.0.1g中发布了一个修复程序,我想知道如何才能在当前版本上安装此修复程序版本?


16
没有使用OS X Mavericks随附的版本-0.9.8y,它没有令人讨厌的错误(在1.0.1中引入)。最佳更新路径取决于安装新版本的位置和方式。which openssl可能会提供信息。另外,主要问题不是openssl命令,而是openssl库(供其他程序使用),这些库在0.9.x版和1.0.x版之间与API不兼容,因此您不想更新系统提供的openssl库!
Gordon Davisson 2014年

@GordonDavisson-您完全正确。我误解了。我显然已经MacPort在这台机器上安装了升级OpenSsl的机器。(可能是在我尝试使python2.7工作时)。可能应该删除此问题,但如果其他人犯了同样的错误,则不会发现SapphireSun的好答案很有用)。
jimbob博士2014年

有了这个澄清的更新,我将保留它。可能有其他人在同一条船上,在这里有这个应该可以使他们知道需要做什么。
Gordon Davisson 2014年

2
如果使用brew安装OpenSSL,它将不会将二进制文件链接到/ usr / bin。因此,如果在命令行上发出openssl,它将不会运行。
Max Ried 2014年

@MaxRied您如何运行自制软件安装的版本?我通过接受的答案中的说明安装了新的openssl,并openssl version返回1.0.1g,但是您是在说openssl命令没有使用该版本?
inorganik

Answers:


147

对于它的价值,我只是使用自制软件(http://brew.sh/):

brew update  
brew install openssl  
brew link --force openssl 
openssl version -a  

如果出现了一个错误的版本(1.0.1a-f),您可以通过以下方式找出正在使用的openssl版本:

which openssl

通常这是从/ usr / bin。为了确保获得更新的版本,请将符号链接拖放到/ usr / local / bin中以指向更新的openssl,如下所示:

ln -s /usr/local/Cellar/openssl/1.0.1g/bin/openssl /usr/local/bin/openssl

作为最后一步的替代方法,有些人用/usr/bin符号链接替换了openssl in /usr/local/Cellar/openssl/1.0.1g/bin/openssl(或任何版本):

mv /usr/bin/openssl /usr/bin/openssl_OLD  
ln -s /usr/local/Cellar/openssl/1.0.1g/bin/openssl /usr/bin/openssl

但这已知会导致某些最新版本的OSX出现问题。最好只在/ usr / local / bin中插入一个新的符号链接,该符号链接在路径上应优先于/ usr / bin。


7
不要删除原始文件,只需将其重命名即可。如果您发现自制的版本无法出于某些目的使用,则没有理由在没有(工作)拨片的情况下使自己陷入困境。
特里N

1
足够公平,但另一方面,我不会称该版本有效...
SapphireSun 2014年

1
即使存在此漏洞,它在您愿意承担计算出的风险以使应用程序X(取决于它)短暂运行的任何情况下仍然对您有用。或者,如果您更喜欢...“有效”,则是指折断的拨片仍然可以推水。:-p
Terry N

8
请注意-执行这些步骤后,在终端窗口中键入“ openssl”失败,并出现“没有这样的文件或目录”错误,指向旧副本(但它确实在新的终端窗口中起作用)。要修复我正在使用的终端窗口,我需要执行以下操作:hash -r
Mike Hedman 2014年

6
比在创建符号链接更好/usr/bin/openssl,可以在创建链接/usr/local/bin/openssl。这应该先/usr/bin对您$PATH和OS X.的较新版本绕过从“系统完整性保护”中出现的问题
mrKelley

14

或者对于那些正在使用mac端口并且不担心保留版本的用户

sudo port upgrade openssl

简单:-)


3
sudo port upgrade outdated也可以。
jimbob博士2014年

1
这很有趣,在我的机器上同时安装了macports和brew都安装了openssl,这实际上是我发生这种情况的原因。跑步sudo port -f uninstall openssl @<old-version>对我
有用

@yair同时具有macports和Homebrew会引起很多问题
user151019 '16

6

要在启用了系统完整性保护的情况下在macOS Sierra上解决OCSP状态请求扩展的无限内存增长(CVE-2016-6304)brew

  1. 临时调整权限,/usr/local以便brew可以更新:

    sudo chgrp -R admin /usr/local
    sudo chmod -R g+w /usr/local
    
  2. 安装OpenSSL的更新版本(您可能需要1.0.2i):

    brew install openssl
    
  3. 您可能希望/需要从以下地址删除到openssl的现有符号链接/usr/local/bin

    rm /usr/local/bin/openssl
    
  4. 重新链接正确的酿造版本:

    sudo ln -s /usr/local/Cellar/openssl/1.0.2i/bin/openssl /usr/local/bin/openssl
    
  5. 恢复对的原始权限/usr/local/bin

    sudo chown root:wheel /usr/local
    

在我的情况下,旧版本的OpneSSL位于/ usr / bin中。尝试更改bin权限时失败。
拉米斯

您在使用Sudo吗?
brandonscript

是。我用了sudo。我发现评论说,在最新版本的OS OS X中,无法更改此文件的权限。所以我停止实现它。
拉米斯

为什么不只更改$PATH变量以查找/usr/local/bin
brandonscript

大家好,我对所有的答案感到困惑,下降符号链接,链接,心脏出血漏洞的bug,等...当我跑$ openssl version我得到的OpenSSL 0.9.8zh 14 Jan 2016,但是当我跑$ brew install openssl我得到Warning: openssl 1.0.2l is already installed。这是否意味着我安装了两个版本?我现在该怎么办?
约书亚

1

谁不想使用brew或端口,而只想替换默认的OpenSSL 0.9.8安装,则始终可以通过重新引导到恢复模式(cmd + R)并发出命令来禁用系统完整性保护

csrutil disable

然后用编译openssl

./config --prefix=/usr
make install

它为我成功地替代了ElCapitan中的OpenSSL,而且我能够编译curl和apache的httpd 2.4,而没有任何直接来自源的问题。某些人可能认为过激的方法背后的原因是ElCapitan不再由Apple维护,并且没有即将进行的更新,因此它可能不会损坏。其次,它使您不必为编译的每个程序都指向/ usr / local中的openssl文件夹,从而使编译更加可靠。

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.